http://acm.hdu.edu.cn/showproblem.php?pid=4004
之前做了个题也是这个情景 但是一直没过竟然把我气哭了 心理承受能力 还真是不太好。
题意:青蛙过河 求它能跳的最远距离最小是多少。
思路:最小化最大值问题,二分+贪心。策略是每回逼不得已才跳一次,二分答案验证。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int a[500010],L,N,M;
bool check(int mid){
int last = 0, cnt = 1;
for(int i=1; i<=N; i++){
if((a[i] - a[last] <= mid) && (a[i + 1] - a[last] > mid)){
last = i;
cnt++;
}
else if(a[i] - a[last] > mid)
return false;
}
if(cnt <= M && a[N+1] - a[last] <= mid) return true;
return false;
}
int main(){
// freopen("in.txt", "r", stdin);
while(scanf("%d%d%d",&L,&N,&M) == 3){
for(int i=1; i<=N; i++){
scanf("%d",&a[i]);
}
a[0] = 0, a[N+1] = L;
sort(a, a+N+1);
int l = 1, r = L, ans = 0;
while(l <= r){
int mid = (l + r) >> 1;
if(check(mid)){
r = mid - 1;
ans = mid;
}
else
l = mid + 1;
}
printf("%d\n",ans);
}
return 0;
}