题意:
奶牛跳房子:总长度为L(1≤L≤109),从N(0≤N≤50,000)块石头中移除M(0≤M≤N)块,使得间距最小值最大。
思路:
同NOIP2015跳石头,二分答案,每次贪心判断。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a1[50010], n, m, l;
bool check(int x){
int now = 0, cnt = 0;
for(int i = 1; i <= n; i ++){
if(a1[i] - now < x) cnt ++;
else now = a1[i];
}
return cnt <= m;
}
int main(){
scanf("%d%d%d", &l, &n, &m);
for(int i = 1; i <= n; i ++) scanf("%d", &a1[i]);
a1[++n] = l;
sort(a1+1, a1+1+n);
int l = 0, r = 1e9, ans = 0;
while(l <= r){
int mid = (l+r)>>1;
if(check(mid)) ans = mid, l = mid + 1;
else r = mid - 1;
}
printf("%d", ans);
return 0;
}