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).
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. OutputFor 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 18Sample Output
4 11
每次做這種題都蒙圈,不過通過這幾種的二分,自己終於抓住了這種問題 的本質,但願以後不會卡這種題。
題意:青蛙跳河,河的寬度爲L, 裏面有n個石頭,青蛙可以跳到石頭上通過這些石頭過河,青蛙最多可以跳m次,求青蛙最大彈跳能力的最小值。
思路: 貪心加二分,要求青蛙最大彈跳能力的最小值,那麼我們就讓青蛙儘量跳m次,並且每次都盡全力跳,
可以通過二分青蛙的彈跳能力來找到解.
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf = 1000000100;
int a[500100];
int n,l,m;
bool ok(int x)
{
int fr = 0;
int step = 0;
for(int i=1; i<=n+1;)
{
if(fr >= l)break; // 一旦到了河對面就沒必要再跳了,感覺這邊也是個坑
int t = i;
while(a[i]-fr <= x && i<=n+1){t=i;++i;}
fr = a[t];
step++;
i = t;
if(step > m) return false;
}
return true;
}
int main()
{
while(scanf("%d %d %d",&l, &n,&m) != EOF)
{
a[0] = 0;
for(int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
}
a[n+1] = l;
sort(a+1,a+1+n+1);
int ll = 0;
int r =inf;
int ans = 0;
while(ll<=r)
{
int mid = (ll+r)/2;
if(ok(mid)){ans=mid; r=mid-1;}
else ll = mid+1;
}
printf("%d\n",ans);
}
return 0;
}
水波.