CF360B Levko and Array

CF360B Levko and Array

一看就二分答案,然后怎么判断就……

可以DP.

设 f[i] 为第i个数不修改情况,然后找到 abs(a[i]-a[j])<=(i-j)*x 就是可以转移的情况了。暴力枚举j,外套一层i,(O(n^2)) 判断, (O(log n)) 二分,总时间复杂度 (O(n^2 log n))

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2005;
int n,k,a[N],l,r,ans; 
bool check(int x) {
	int f[N]={0};
	for(int i=1;i<=n;++i) {
		f[i]=i-1;
		for(int j=1;j<i;++j) {
			if(abs(a[i]-a[j])<=(i-j)*x)
				f[i]=min(f[i],f[j]+i-j-1);
		}
		if(f[i]+n-i<=k)return true;
	}
	return false;
}
signed main() {
	scanf("%lld%lld",&n,&k);
	for(int i=1;i<=n;++i)
		scanf("%lld",&a[i]);
	for(int i=1;i<n;++i)
		r=max(r,abs(a[i]-a[i+1]));
	while(l<=r) {
		int mid=(l+r)>>1;
		if(check(mid))ans=mid,r=mid-1;
		else l=mid+1;
	}
	printf("%lld
",ans);
	return 0;
}
路漫漫其修远兮,吾将上下而求索
原文地址:https://www.cnblogs.com/zzctommy/p/12416542.html