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

时间:2021-04-24 17:10:34

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

题意不好理解。

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

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

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

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

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

输入:

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