死了吗小枫~ 死了吗小枫|

GCSG01

园龄:1年3个月粉丝:2关注:20

CF360B题解

简述题意

定一个数列 a,可以对其中的元素做至多 k 次修改,每次修改可以将数列中的一个数改成另一个。
求经过修改后,maxi=1n|aiai1|

思路

考虑二分答案,对于 check 函数,我们可以利用 dp 进行求解。
由于修改不太好想,我们可以把问题转换为让不被修改的数最多。容易发现,如果有 a1,a2,a3 3个数都需要修改,当 a2 有值可以使得这两个差都满足条件,我们就可以稍改一个,即条件为 |aiaj|<(ij)×x

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,k;
int a[2005];
int dp[2005];
bool check(int x)
{
	for(int i=1;i<=n;i++)
    {
		dp[i]=1;
		for(int j=1;j<i;j++)
			if(abs(a[i]-a[j])<=x*(i-j))
                dp[i]=max(dp[i],dp[j]+1);
		if(dp[i]>=n-k) return true;
	}
	return false;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int l=-1,r=2e9;//不知道为什么,l设为0或其他数都过不了,只有设为-1才能过
    while(l+1<r)
    {
        int mid=(l+r)>>1;
        if(check(mid))r=mid;
        else l=mid;
    }
    cout<<r;
    return 0;
}
posted @   GCSG01  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
漂浮磁力线/鼠标吸铁石特效
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起