URAL - 1917 Titan Ruins: Deadly Accuracy(水题)

水题一个,代码挫了一下:

题意不好理解。

你去一个洞窟内探险,洞窟内有许多宝石,但都有魔法守护,你需要用魔法将它们打下来。

每个宝石都有自己的防御等级,当你的魔法超过它的防御等级时它就会被你打下来。

但是,当它被你打下来的时候,它会反弹你的魔法。如果反弹的魔法过强,你就会被自己的魔法杀死。

很不幸的是,你的魔法是群体性的,你不能选择攻击谁,只要防御等级低于你魔法水平的宝石都会被你打下来。并且每个都会反弹你的魔法。

你可以假设你的魔法水平无限大,但你躲避反弹的魔法的能力却并不是很强。

输入:

第一行两个数,分别是:N,宝石总数。P:你躲避反弹魔法的能力。(只要达到这个数你就会死)

第二行N个数,每个宝石的防御等级。

输出:

一行,两个数,分别是你能打下多少宝石,以及需要释放几次魔法。

样例输入:

5 4

4 1 4 1 2

样例输出:

3 2

样例说明:

第一次用强度为1的魔法打下两个防御等级为1的宝石,反弹魔法为2,可以承受。

第二次用强度为2的魔法打下一个防御等级为2的宝石,反弹魔法为2,可以承受。

剩余2个防御等级为4的宝石,是无法打下来的。(反弹魔法会达到8)

所以答案为3 2.

测试:

5 3

1 2 2 3 4

==> 1 1

代码如下:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <algorithm>

#define M 1005

using namespace std;

int a[M], num[M], cnt[M];
int n, k, x, pre;
int main ()
{
    scanf("%d%d",&n, &k);
    pre = -1;
    int cur = 0;
    for(int i = 1; i <= n; ++i)
        scanf("%d",&a[i]);
    sort(a+1,a+1+n);
    for(int i = 1; i <= n; ++i)
    {
        if(a[i]!=pre)
        {
            num[++cur] = a[i];
            cnt[cur] = 1;
        }
        else
            cnt[cur] += 1;
        pre = a[i];
    }
    int last = 0, ans = 1, ansn = 0;
    for(int i = 1; i <= cur; ++i)
    {
        if(k>=num[i]*cnt[i])
        {
            ansn += cnt[i];
            last += cnt[i];
            if(k < num[i]*last)
            {
                ans += 1;
                last = cnt[i];
            }
        }
        else break;//代码小挫的地方
    }
    if(ansn==0) ans = 0;
    printf("%d %d\n", ansn, ans);
    return 0;
}


你可能感兴趣的:(URAL - 1917 Titan Ruins: Deadly Accuracy(水题))