这个O(n)的做法是正确的的吗
查看原帖
这个O(n)的做法是正确的的吗
242986
Cyrus28214楼主2021/4/7 20:31
#include<bits/stdc++.h>

using namespace std;

const int N = 6000;

int n, k, f[N], h[N], p[N], head, tail;

int main(){
	scanf("%d%d", &n, &k);
	for(int i = 1; i <= n; ++i)
		scanf("%d", h+i);
	memset(f, 0x3f, sizeof(f));
	f[1] = p[0] = 1;
	for(int i = 2; i <= n; ++i){
		while(i - p[head] > k) ++head;
		while(tail > head && 1ll * (h[p[tail]] - h[p[tail-1]]) * (i - p[tail]) <= 1ll * (h[i] - h[p[tail]]) * (p[tail] - p[tail-1])) f[i] = min(f[i], f[p[tail--]]+1);
		f[i] = min(f[i], f[p[tail]]+1);
		p[++tail] = i;
	}
	printf("%d\n", f[n]);
	
	return 0;
}
2021/4/7 20:31
加载中...