HDU4004——The Frog's Games

http://acm.hdu.edu.cn/showproblem.php?pid=4004

这道题讲的是青蛙在限定步骤之内跳过河,所以判断最小的每次跳的步长。

思路理解:找到每块石头之间的最大值为石头最小步长,最大值当然就是河宽了。所以剩下了就是用二分枚举了。

//我烦的一个错误就是sort函数是从0-n(sort(a,a+n););

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; 
//L河的宽度, N个石头,至多m次跳跃 1000000000
//查找一个【所有石头间最短句,河的宽度】
//通过二分查找找到中间值,当不符合的时候,那么比他小的值就跟不符合了!!
//就放在向右的界限里。 
bool binarySearch(int a[],int left,int right);
bool panduan(int mid);
int a[500003],k,L,n,m; 
int main(){
    while(~scanf("%d%d%d",&L,&n,&m)){
        a[0]=0; 
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]); 
        }
        sort(a+1,a+n+1);//1-n个数排序 
        a[n+1]=L;
        k=0;
        for(int i=1;i<=n+1;i++){
            if(k<a[i]-a[i-1]){
                k=a[i]-a[i-1];
//                printf("%d",k);
            }
        }
        
//        printf("%d %d %d
",n,k,L);
        binarySearch(a,k,L);
        
    }
} 
bool binarySearch(int a[],int left,int right){
         int middle;
         while (left <right){
           middle = (left + right)/2;
//               printf("%d..mid.. %d.. %d
",middle,left,right);
              if(panduan(middle)){
                  right=middle;
//                  printf(">>");
              }else{
                  left=middle+1;
//                  printf("<<"); 
              }
//              printf("%d..mid.. %d.. %d
",middle,left,right);
          }
          printf("%d
",left);
        return false;
    }

/*
判断是否从第n+1个数到第n个数决定是否能够成功通过。
 
*/
    bool panduan(int mid){
        int now=n+1,i=n+1,step=0;
        while(now>0){
             while(a[now]-a[i]<=mid&&i>=0){
                 i--;
             }
//             printf("%d...i
",i);
             now=i+1;
             step++; 
        }
         if(step>m)return false;
//        printf("%d..step
",step);
        return true;
    }
原文地址:https://www.cnblogs.com/Yvettey-me/p/4528389.html