zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    [JLOI2011] 飞行路线
    高精度运算模板
    Dijkstra算法模板
    [SDOI2010] 外星千足虫
    [SDOI2006] 线性方程组
    [CTSC2014] 企鹅QQ
    模板三连击:树状数组+线段树+主席树
    [ZJOI2008] 树的统计
    [国家集训队] 礼物
    [洛谷P4720] [模板] 扩展卢卡斯
  • 原文地址:https://www.cnblogs.com/Yvettey-me/p/4528389.html
Copyright © 2011-2022 走看看