原题链接:
题意简述:求在1~N中选C个位置,每俩个位置之间距离最小的值最大化。
思路:让距离最小的那个距离最大。可以看出来答案具有单调性,那我们就可以转求解为判定,用二分搜索来求结果。具体做法就是假定一个答案,再不断缩小答案范围,最终得到解。
注意点:while循环内的判定条件需要仔细考虑,稍有改变就会有截然不同的结论。
代码示例:
#include#include 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。