zoukankan      html  css  js  c++  java
  • HDU 4004 The Frog's Games(二分答案)

    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


     

    Problem Description
    The annual Games in frogs' kingdom started again. The most famous game is the Ironfrog Triathlon. One test in the Ironfrog Triathlon is jumping. This project requires the frog athletes to jump over the river. The width of the river is L (1<= L <= 1000000000). There are n (0<= n <= 500000) stones lined up in a straight line from one side to the other side of the river. The frogs can only jump through the river, but they can land on the stones. If they fall into the river, they 
    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).
     


     

    Input
    The input contains several cases. The first line of each case contains three positive integer L, n, and m. 
    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.
     


     

    Output
    For each case, output a integer standing for the frog's ability at least they should have.
     


     

    Sample Input
     
    6 1 2 2 25 3 3 11 2 18
     
     


     

    Sample Output
     
    4 11
     
     


     

    Source
     


     

    Recommend
    lcy


     

     

    【题意】

    有一条长度为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
    ",ans);
    	}
    	return 0;
    } 
     
  • 相关阅读:
    oracle 11g 断电后 无法启动 ora 00600 kcratr_scan_lastbwr 修复小计
    arcgis for python (arcpy) 入门
    解决 构造函数 包含业务逻辑 IDE无法初始化界面的问题
    arcgis 10.1 发布 气温插值GP服务小计
    执行 Animation先决条件
    ASP.NET MVC3学习心得视图和模型
    Axure使用心得分享
    ASP.NET MVC3学习心得表单和HTML辅助方法
    ASP.NET MVC3学习心得入门和控制器
    WindowsPhone 中SQL CE数据库的使用
  • 原文地址:https://www.cnblogs.com/shenben/p/10311986.html
Copyright © 2011-2022 走看看