20240705比賽總結

wangsiqi2010916發表於2024-07-05

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