codeforces 360B

题意:给定n个数和一个k,可以改变k个值,最小化相邻两项的差的绝对值的最大值

题解:

最大值最小,可以考虑二分答案;

然后考虑保留哪些关键点不变,dp[i]表示第i个点不变,

如果abs(a[i]-a[j])<=x*(i-j),则我们可以从第j个点转移过来,中间的点分布在线段IJ上

然后看是否超过k个

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 #define maxn 2005
 4 using namespace std;
 5 int n,k;
 6 ll a[maxn];
 7 int dp[maxn];
 8 bool check(ll x)
 9 {
10     memset(dp,0,sizeof(dp));
11     int ans=n;
12     for(int i=1;i<=n;++i)
13     {
14         dp[i]=i-1;
15         for(int j=1;j<i;++j)if(abs(a[i]-a[j])<=x*(i-j))
16             dp[i]=min(dp[i],dp[j]+(i-j-1));
17         ans=min(ans,dp[i]+n-i);
18     }
19     return (ans<=k);
20 }
21 int main()
22 {
23     scanf("%d%d",&n,&k);
24     for(int i=1;i<=n;++i)scanf("%I64d",&a[i]);
25     ll l=0,r=2000000000,ans=r+1;
26     while(l<=r)
27     {
28         int mid=(l+r)>>1;
29         if(check(mid))ans=mid,r=mid-1;
30         else l=mid+1;
31     }
32     printf("%d\n",ans);
33     return 0;
34 }
View Code

 

转载于:https://www.cnblogs.com/uuzlove/p/10466287.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值