Description
青蛙王国运动会开始了,最受欢迎的游戏是铁蛙三项赛,其中一项是跳跃过河项目。这个项目需要青蛙运动员通过跳跃过河。河的宽度是L。在河面上有直线排列的n个石头。青蛙可以利用这些石头跳跃过河,如果落入河中则失败。青蛙们能够跳跃的最多次数是m。现在铁蛙门想要知道他们至少需要具备多大的跳跃距离,才能够顺利完成比赛。
Input
输入包含了多个测试样例,测试样例第一行包含了3个正整数L,n,m。接下来的i(i<=n)行中,第i表示第i个石头距离起跳岸边的距离,其中不存在两个石头距离相同的情况。
Output
输出一个整数,表示铁蛙要完成比赛需要具备的最低跳跃能力。
Sample Input
6 1 2 2 25 3 3 11 2 18
Sample Output
4 11
1 #include <stdio.h> 2 #include <string.h> 3 #include <iostream> 4 #include <string> 5 #include <math.h> 6 #include <algorithm> 7 #include <vector> 8 #include <stack> 9 #include <queue> 10 #include <set> 11 #include <map> 12 #include <sstream> 13 const int INF=0x3f3f3f3f; 14 typedef long long LL; 15 const int mod=1e9+7; 16 //const double PI=acos(-1); 17 #define Bug cout<<"---------------------"<<endl 18 const int maxn=1e5+10; 19 using namespace std; 20 21 int A[maxn];//存放每块石头到开始处的距离 22 int B[maxn];//存放石头之间的差值 23 24 int main() 25 { 26 int L,n,m; 27 while(~scanf("%d %d %d",&L,&n,&m)) 28 { 29 memset(A,0,sizeof(A)); 30 memset(B,0,sizeof(B)); 31 int MAX=0;//答案不可能会小于石头差值中的最大值,否则这两块石头一定跳不过去 32 for(int i=1;i<=n;i++) 33 { 34 scanf("%d",&A[i]); 35 if(i==n) 36 A[i+1]=L;//最后要跳到河岸上 37 } 38 sort(A+1,A+1+n+1); 39 for(int i=1;i<=n+1;i++) 40 { 41 B[i]=A[i]-A[i-1]; 42 if(B[i]>MAX) 43 MAX=B[i]; 44 } 45 int l=MAX; 46 int r=L; 47 int mid; 48 while(l<=r)//二分查找答案 49 { 50 mid=(l+r)>>1;//二分法的中值(即初始青蛙能跳的最大距离) 51 int step=0;//记录跳的步数 52 int sum=0;//检验到这个石头需要跳的距离 53 for(int i=1;i<=n+1;i++)//此处用到贪心,一次尽量多跳几个石头 54 { 55 if(sum+B[i]<=mid)//可以继续跳 56 sum+=B[i]; 57 else//不可以继续跳 58 { 59 step++;//跳的次数加1 60 sum=B[i];//下一次从这个石头起跳 61 } 62 if(i==n+1&&sum!=0)//跳到岸了,处理一下 63 step++; 64 } 65 if(step>m) 66 l=mid+1; 67 else 68 r=mid-1; 69 } 70 printf("%d\n",mid); 71 } 72 return 0; 73 }