您的位置:首页 > 其它

HDU 4415 Assassin’s Creed

2013-03-26 21:03 447 查看

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


[align=left]Problem Description[/align]
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.

[align=left]Input[/align]
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).

[align=left]Output[/align]
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.

[align=left]Sample Input[/align]

2
3 5
4 1
5 1
7 7
2 1
2 2
4 0

[align=left]Sample Output[/align]

Case 1: 3 4
Case 2: 0 0

[align=left]Source[/align]
2012 ACM/ICPC Asia Regional Hangzhou Online

[align=left]Recommend[/align]
liuyiding
      想到贪心了,但是没有想到居然是这样贪心啊。 看着别人的解题报告做的,有的地方理解的还是不够透彻
http://blog.csdn.net/goomaple/article/details/8016328
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: