一看就二分答案,然后怎么判断就……
可以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\n",ans);
return 0;
}
原文链接: https://www.cnblogs.com/zzctommy/p/12416542.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/333494
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!