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;
}
T2 聰明的小明
https://gxyzoj.com/d/hzoj/p/3732
很抽象的狀壓dp