Ural 1917 Titan Ruins: Better late than killed

来源:互联网 发布:php新视频教程 编辑:程序博客网 时间:2024/06/05 03:20

http://acm.timus.ru/problem.aspx?space=1&num=1917

时间限制:1秒

空间限制:64MB

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

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

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

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

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

输入:

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

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

输出:

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

样例输入:

5 4

4 1 4 1 2

样例输出:

3 2

样例说明:

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

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

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

所以答案为3 2.

#include<iostream>#include<stdio.h>#include<math.h>#include<algorithm>#include<string.h>using namespace std;struct node{    int num,t;//数字和出现的次数 }p[1005];bool cmp(node a,node b){    return a.num<b.num;}int n;int main(){    int i,j;    long long pp;    while(scanf("%d%lld",&n,&pp)!=EOF)    {        int ss=0;        int sum=0;        int tt=0;        int top=0;        int flag=0;        node tmp;        for(i=0;i<=n;i++)        p[i] .t=0;        scanf("%d",&p[top++].num);        p[0].t=1;        for(i=2;i<=n;i++)        {//处理数字以及出现的次数                 scanf("%d",&tmp.num);                tmp.t=1;                flag=0;             for(j=0;j<top;j++)             {                if(tmp.num==p[j] .num)                {                    p[j] .t++;                    flag=1;                 //   printf("i=%d %d %d\n",i,j,p[j] .t);                    break;                }             }             if(flag==0)             {                p[top++]=tmp;             }        }        sort(p,p+top,cmp);//按数字从小到大排序         for(i=0;i<top;i++)        {            if(p[i] .num*p[i] .t<=pp)            {                ss=p[i] .t;                sum+=ss;//如果说现在的能力值大于反击值                // printf("%d %d\n",i,p[i] .num*p[i] .t);                for(j=i+1;j<top;j++)//那么继续往下找                 {                    ss+=p[j] .t;                    if(ss*p[j] .num>pp)                    {                    //    printf("j=%d\n",j);                        break;                    }                    sum+=p[j] .t;                }               // printf("%d\n",i);                i=--j;                tt++;            }            else   //因为是从小到大排序,所以这个如果不行,那么以后的也不行             break;        }       /* for(i=0;i<top;i++)        {            printf("i=%d %d %d\n",i,p[i] .num,p[i] .t);        }*/        printf("%d %d\n",sum,tt);    }}


0 0
原创粉丝点击