HDU 4004 The Frog's Games(二分答案)
阿新 • • 發佈:2019-01-24
into most color padding ria graph should esc tom
are out. The frogs was asked to jump at most m (1<= m <= n+1) times. Now the
frogs want to know if they want to jump across the river, at least what
ability should they have. (That is the frog‘s longest jump distance).
Then n lines follow. Each stands for the distance from the starting banks to
the nth stone, two stone appear in one place is impossible.
The Frog‘s Games
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)
Total Submission(s): 10307 Accepted Submission(s): 4686
6 1 2 2 25 3 3 11 2 18
4 11
【題意】
有一條長度為L和河流,中間穿插n個石墩,青蛙跳m次經過石凳後到達對岸,求青蛙每次跳躍的最大距離的最小值
【分析】
1.二分左邊界left=1,右邊界right=L
2判斷mid=(left+right)/2是否可以在跳躍m次以內(包括m)到達對岸,具體做法通過貪心來完成,盡量每一次跳躍跨過的石凳最遠,這樣可以使跳躍的總次數最小
3不斷將區間二分,最終left==right時,left就是要求的值
【代碼】
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=5e5+5;
int n,m,len,dis[N];
bool judge(int now){
if(dis[1]>now) return 0;
int sp=0,tot=0;
for(int i=1;i<=n;){
if(dis[i]-sp<=now){
if(dis[i]-sp==now||i==n){
tot++;
sp=dis[i];
}
i++;
}
else{
tot++;
sp=dis[i-1];
if(dis[i]-sp>now) return 0;
}
}
return tot<=m;
}
int main(){
while(scanf("%d%d%d",&len,&n,&m)==3){
for(int i=1;i<=n;i++) scanf("%d",dis+i);dis[++n]=len;
sort(dis+1,dis+n+1);
int l=1,r=len,mid,ans=0;
while(l<=r){
int mid=l+r>>1;
if(judge(mid)){
ans=mid;
r=mid-1;
}
else l=mid+1;
}
printf("%d\n",ans);
}
return 0;
}
HDU 4004 The Frog's Games(二分答案)