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

来源:互联网 发布:土木工程预算软件 编辑:程序博客网 时间:2024/05/16 08:03

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

题意不好理解。

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

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

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

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

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

输入:

第一行两个数,分别是: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 1005using 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;}


原创粉丝点击