HDU

来源:互联网 发布:mac电脑如何制作铃声 编辑:程序博客网 时间:2024/05/02 01:42

传送门:HDU 5037

题意:有一条小河长为M的小河,小河里存在N个石头,有一个每次能跳L米的小青蛙,随意添加石头保证青蛙能从头跳到尾的前提下,问青蛙使用最优策略跳到对岸最多需要多少次。

思路:我们要使青蛙跳的次数最多,那么必然要每L + 1的距离尽量使得青蛙跳两次,因此若连续一个或多个L + 1的距离没有石头,那么我们就可以让青蛙每L + 1跳两次,若有原有的石头,我们加石头时就要保证每两个不相邻的石头之间要大于等于l + 1,实现过程中我们就记录一下前一次跳的距离pre,如果这一次的余数x + pre <= L 那么x就会被青蛙合并到本次的最后一步中,即

pre = pre + x, 若x + pre > L, 那么就无法合并成一步了,则 pre = x.

代码:

#include<bits/stdc++.h>#define ll long long#define inf 0x3f3f3f3fusing namespace std;typedef pair<int,int> P;const int MAXN = 200010;int val[MAXN];int main(){int T, n, m ,l;cin >> T;int kase = 1;while(T--){scanf("%d %d %d", &n, &m, &l);for(int i = 1; i <= n; i++)scanf("%d", val + i);sort(val + 1, val + n + 1); val[++n] = m;int x, y, pre = l, ans = 0;for(int i = 1; i <= n; i++){x = (val[i] - val[i - 1]) % (l + 1);y = (val[i] - val[i - 1]) / (l + 1);if(pre + x > l)ans += 2 * y + 1, pre = x;elseans += 2 * y, pre += x; }printf("Case #%d: %d\n", kase++, ans);} return 0;}



原创粉丝点击