HDU 5037 Frog(贪心)

题意比较难懂,一只青蛙过河,它最多一次跳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;
}

 

posted @ 2015-09-24 11:05  Howe_Young  阅读(352)  评论(0编辑  收藏  举报