POJ2456(最大化最小值)解题报告
原题链接: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。