POJ2456(最大化最小值)解题报告

版权声明:个人笔记,仅供复习 https://blog.csdn.net/weixin_41162823/article/details/85120224

原题链接:POJ2456

题意简述:求在1~N中选C个位置,每俩个位置之间距离最小的值最大化。

思路:让距离最小的那个距离最大。可以看出来答案具有单调性,那我们就可以转求解为判定,用二分搜索来求结果。具体做法就是假定一个答案,再不断缩小答案范围,最终得到解。

注意点:while循环内的判定条件需要仔细考虑,稍有改变就会有截然不同的结论。

代码示例:

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 1e5+10;
int stall[maxn];
int n,c;
bool C(int size){
	int cnt = 1;
	int last = 0;
	for(int i = 1;i < n;i++){
		if(stall[i] - stall[last] >= size) cnt++,last = i;
	}
	return cnt >= c;
}
int main(){
	scanf("%d%d",&n,&c);
	for(int i = 0;i < n;i++)
		scanf("%d",stall+i);
	sort(stall,stall+n);
	long long l = 0,r = 3e9;
	while(l < r){
		int mid = (l + r)/2;
		if(C(mid)) l = mid+1;
		else r = mid;
	}	
	printf("%lld\n",l-1);
	return 0;
}

至于为什么最后答案是l-1呢?假设到了最后一个成立的答案mid,此时l = mid + 1 ,那么下一个必定不成立并l = r退出,此时答案其实为l - 1,即上述的mid。

猜你喜欢

转载自blog.csdn.net/weixin_41162823/article/details/85120224