题目链接 https://nanti.jisuanke.com/t/40401
看题解说是二分查找+贪心
题意:从 l 个数里选择 s 个数字,使得任意两个数之差绝对值中的最小值最大(有点绕口/挠头) 最大化最小值
做题时我在想怎么选择这 s 个数字,感觉应该要从这些数的中间入手,但是当时不知道该咋办。。。
二分最终的答案,看能不能放完所有的基站
代码如下
也就是说你假设一个答案,通过二分判断基站是否能够建完来判断这个答案是否正确。
#include<iostream> #include<algorithm> using namespace std; int loc[100005]; int n, c; bool test(int len){ int p = 0; //第一个基站放在p[0]; int q = c-1; for(int i=1; i<n; i++){ if( loc[i] - loc[p] >= len ){ //后面的距离都要至少大于前面的距离 p = i; q--; if(q == 0) return true; } } return false; } int main() { while(cin>>n>>c, n||c){ for(int i=0; i<n; i++){ cin>>loc[i]; } sort(loc, loc+n); int l = 0; int r = location[n-1]; int mid = 0; while(r-l!=1){ mid = (l + r)>>1;//除2? if(test(mid)){ l = mid; } else { r = mid; } } cout << l << endl; } getchar(); getchar(); return 0; }