您的位置:首页 > 其它

HDU 5037 Frog(贪心)

2015-09-24 11:05 253 查看
题意比较难懂,一只青蛙过河,它最多一次跳L米,现在河中有石头,距离不等,上帝可以往里加石头,青蛙非常聪明,它一定会选择跳的次数最少的路径。问怎么添加石头能让青蛙最多的次数。输出青蛙跳的最多的次数。

考虑对于长度L+1,上帝一定会让青蛙跳两次。那么只需要尽可能的构造L+1就行了。那么就需要求多少个L+1就行了。还有就是需要记录上一次跳的距离,如果上一次跳的距离加上这次的距离小于L+1的话,那么上次一定会跳到当前这个点,而不是跳到上次那个点,所以更新一下上次的距离。也就是这两种情况:

1)上一步pre加这一步余数y大于L,则最后剩余部分需要单独跳;

2)上一步pre加这一步余数y小于等于L,最后剩余部分可以并进上一步,即pre+y。

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn = 2 * 1e5 + 10;
int a[maxn];
int main()
{
int T, n, m, L, kase = 0;
scanf("%d", &T);
while (T--)
{
scanf("%d %d %d", &n, &m, &L);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
a[0] = 0; a[++n] = m;
sort(a, a + n);
int ans = 0, pre = L;
for (int i = 1; i <= n; i++)
{
int x = (a[i] - a[i - 1]) / (L + 1);
int y = (a[i] - a[i - 1]) % (L + 1);
if (y + pre >= L + 1)
{
pre = y;
ans += 2 * x + 1;
}
else
{
pre = pre + y;
ans += 2 * x;
}
}
printf("Case #%d: %d\n", ++kase, ans);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: