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",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\n",middle,left,right); if(panduan(middle)){ right=middle; // printf(">>"); }else{ left=middle+1; // printf("<<"); } // printf("%d..mid.. %d.. %d\n",middle,left,right); } printf("%d\n",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\n",i); now=i+1; step++; } if(step>m)return false; // printf("%d..step\n",step); return true; }
HDU4004——The Frog's Games
时间: 2024-10-10 23:17:19