题目大意:有N个牛舍在同一条直线上,每个牛舍都有相应的坐标
现在有C头牛,要求放在这牛舍中,使得相邻两头牛之间的距离的最小值达到最大
解题思路:直接二分距离,然后再进行判断
这题得反省一下了:因为我把cur重复定义了,所以一直找不到错误,标记一下。。。
#include
#include
#include
using namespace std; #define maxn 100010 int pos[maxn]; int n, c; int find(int s, int e, int dis) { int l = s, r = e; while(l < r) { int mid = (l + r) / 2; if(pos[mid] >= dis) r = mid; else l = mid + 1; } return l; } bool judge(int mid) { int dis = pos[0], cur = 1; for(int i = 1; i < c; i++) { dis += mid; if(dis > pos[n - 1]) return false; cur = find(cur, n - 1, dis); // int cur = lower_bound(pos, pos + n, dis) - pos; dis = pos[cur]; } return true; } int solve() { int l = 0, r = pos[n - 1]; while(l <= r) { int mid = (l + r) / 2; if(judge(mid)) l = mid + 1; else r = mid - 1; } return l - 1; } void init() { for(int i = 0; i < n; i++) scanf("%d", &pos[i]); sort(pos, pos + n); } int main() { while(scanf("%d%d", &n, &c) != EOF) { init(); printf("%d\n", solve()); } return 0; }