T1 酸碱度中和
https://gxyzoj.com/d/hzoj/p/3731
因为是要将一些数变为一个值,所以差相对小的一些数修改的会更少,所以可以先将原数组排序
因为当x可以时,x+1必然可以,所以考虑二分
接下来考虑到因为上下变动的都至多为m,所以开头和结尾的差必然不超过2m
它就可以看作用一些长度为2m的版进行覆盖,问最少要多少块
显然,从1开始,然后在终点后的第一个点继续,暴力枚举即可
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int n,k,a[100005];
bool check(int x)
{int lst=-2e9-1,cnt=0;for(int i=1;i<=n;i++){if(a[i]-2*x>lst){lst=a[i];cnt++;}}if(cnt<=k) return 1;return 0;
}
int main()
{scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}sort(a+1,a+n+1);int l=0,r=a[n];while(l<r){int mid=(l+r)>>1;if(check(mid)){r=mid;}else l=mid+1;}printf("%d",l);return 0;
}