POJ3258 http://poj.org/problem?id=3258
题目大意:一群奶牛闲着没事要过河(居然是跳的),奶牛一次跳的距离没有限制,现在要删除M个石头让奶牛跳石头的距离最小值最大化。
解题思路:二分,从0到最大距离二分,然后根据距离进行分组,组数过多就false调整上下限。
AC代码:
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
using namespace std;
const int enf = 0x3f3f3f;
const int maxn = 50000 + 5;
int l, m, n;
int minn = enf,maxx = 0;
int d[maxn];
int dis[maxn];
bool judge(int mid) {
int st = 0,grp = 0;
for(int i = 1;i <= n; i++) {
if(d[i] - st < mid) grp++;
else st = d[i];
}
if(l - st < mid) return false;
if(grp > m) return false;
return true;
}
int main() {
while(cin >> l >> n >> m) {
for (int i = 1; i <= n; i++) {
cin >> d[i];
}
sort(d, d + n + 1);
int left = 0, right = l, ans = 0;
while (left <= right) {
int mid = (left + right) >> 1;
if (judge(mid)) {
left = mid + 1;
ans = mid;
} else {
right = mid - 1;
}
}
cout << ans << endl;
}
}