HDU 4415 Assassin’s Creed

Assassin’s Creed

Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 976 Accepted Submission(s): 276


Problem Description
Ezio Auditore is a great master as an assassin. Now he has prowled in the enemies’ base successfully. He finds that the only weapon he can use is his cuff sword and the sword has durability m. There are n enemies he wants to kill and killing each enemy needs Ai durability. Every time Ezio kills an enemy he can use the enemy’s sword to kill any other Bi enemies without wasting his cuff sword’s durability. Then the enemy’s sword will break. As a master, Ezio always want to do things perfectly. He decides to kill as many enemies as he can using the minimum durability cost.

Input
The first line contains an integer T, the number of test cases.
For each test case:
The first line contains two integers, above mentioned n and m (1<=n<=10^5, 1<=m<=10^9).
Next n lines, each line contains two integers Ai, Bi. (0<=Ai<=10^9, 0<=Bi<=10).

Output
For each case, output "Case X: " (X is the case number starting from 1) followed by the number of the enemies Ezio can kill and the minimum durability cost.

Sample Input
  
  
2 3 5 4 1 5 1 7 7 2 1 2 2 4 0

Sample Output
  
  
Case 1: 3 4 Case 2: 0 0

Source

Recommend
liuyiding
      想到贪心了,但是没有想到居然是这样贪心啊。 看着别人的解题报告做的,有的地方理解的还是不够透彻
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
struct num
{
    int val1,val2;
}a[1100000];
int cmp(const void *e,const void *f)
{
    struct num *p1=(struct num *)e;
    struct num *p2=(struct num *)f;
    if(p1->val1!=p2->val1)
    {
        return p1->val1 - p2->val1;
    }
    return p1->val2 - p2->val2;
}
int main()
{
    int i,j,n,m,s,t,T,flag,nn,mm,sum;
    int res1,res2,res3,res4;
    t=1;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d %d",&n,&m);
        res1=res2=res3=res4=0;
        for(i=0;i<=n-1;i++)
        {
            scanf("%d %d",&a[i].val1,&a[i].val2);
        }
        qsort(a,n,sizeof(a[0]),cmp);
        mm=m;
        for(i=0;i<=n-1;i++)
        {
            if(mm>=a[i].val1)
            {
                res1++;
                res2+=a[i].val1;
                mm-=a[i].val1;
            }
        }
        for(i=0;i<=n-1;i++)
        {
            if(a[i].val2)
            {
                break;
            }
        }
        if(i!=n&&a[i].val1<=m)
        {
            res4=a[i].val1;
            m-=a[i].val1;
            flag=i;
            for(j=i,sum=0;j<=n-1;j++)
            {
                sum+=a[j].val2;
            }
            if(sum>=n)
            {
                printf("Case %d: %d %d\n",t++,n,res4);
                continue;
            }
            res3=sum+1;
            nn=n-res3;
            for(i=0;i<=nn-1;i++)
            {
                if(m>=a[i].val1&&flag!=i)
                {
                    res3++;
                    m-=a[i].val1;
                    res4+=a[i].val1;
                }else if(flag==i)
                {
                    nn++;
                }
            }
        }
        if(res1>res3)
        {
            printf("Case %d: %d %d\n",t++,res1,res2);
        }else if(res1==res3)
        {
            if(res2<res4)
            {
                printf("Case %d: %d %d\n",t++,res1,res2);
            }else
            {
                printf("Case %d: %d %d\n",t++,res3,res4);
            }
        }else
        {
            printf("Case %d: %d %d\n",t++,res3,res4);
        }
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值