/* 先求出青蛙步长的下限和上限,再二分即可 */
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
using namespace std;
const int MAXN = 500010;
int l, n, m, dis[MAXN];
int Max; // 相邻石头间距的最大值,亦即青蛙的最小步长
bool canCross(int s)
{
int nowPos = 0, steps = 0;
if (s < Max)
return false;
for (int i = 0; i < n; ++i)
{
if ((dis[i] <= nowPos + s) && (dis[i+1] > nowPos + s))
{
steps++;
nowPos = dis[i];
}
}
steps++;
if (steps <= m)
return true;
return false;
}
int bSearch(int l, int r)
{
int ans;
while (l <= r)
{
int mid = (l + r) / 2;
if (canCross(mid))
{
ans = mid;
r = mid - 1;
}
else l = mid + 1;
}
return ans;
}
int main()
{
while (scanf("%d %d %d", &l, &n, &m) != EOF)
{
for (int i = 0; i < n; ++i)
{
scanf("%d", &dis[i]);
}
dis[n] = l;
sort(dis, dis + n + 1);
Max = dis[0];
for (int i = 1; i <= n; ++i)
{
Max = max(Max, dis[i] - dis[i-1]);
}
printf("%d\n", bSearch(Max, l));
}
return 0;
}
HDU 4004 The Frog's Games
最新推荐文章于 2012-10-29 17:24:16 发布