您的位置:首页 > 其它

HDU4415 Assassin’s Creed

2012-09-24 13:18 260 查看
贪心

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Ni = 100010;
struct node{
int a,b;
bool operator < (const node &aa) const
{
return a<aa.a;
}
}arr[Ni];
int main()
{
int i,n,m,t,k,cs=1;
scanf("%d",&t);
while(t--)
{
int ansm=0,ansn=0;k=-1;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d%d",&arr[i].a,&arr[i].b);
sort(arr,arr+n);
for(i=0;i<n;i++) if(arr[i].b>=1)
break;
if(arr[i].a<=m)
{
ansm+=arr[i].a;k=i;ansn++;
for(i=0;i<n;i++)
ansn+=arr[i].b;
}
if(ansn>=n) {printf("Case %d: %d %d\n",cs++,n,ansm);continue;}
for(i=0;i<n&&arr[i].a+ansm<=m&&ansn!=n;i++)
if(i!=k) {ansm+=arr[i].a;ansn++;}
printf("Case %d: %d %d\n",cs++,ansn,ansm);
}
return 0;
}


看了评论后完善的代码

1

6 5
1 0
1 0
1 0
1 0
1 0
5 1

ans: 5 5

上面的程序输出是2 5(不过也AC了可能是数据不够强)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Ni = 100010;
struct node{
int a,b;
bool operator < (const node &aa) const
{
return a<aa.a;
}
}arr[Ni];
int main()
{
int i,n,m,t,k,cs=1;
scanf("%d",&t);
while(t--)
{
int ansm=0,ansn=0;k=-1;
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d%d",&arr[i].a,&arr[i].b);
sort(arr,arr+n);
for(i=0;i<n;i++) if(arr[i].b>=1)
break;
if(arr[i].a<=m)
{
ansm+=arr[i].a;k=i;ansn++;
for(i=0;i<n;i++)
ansn+=arr[i].b;
}
if(ansn>=n) {printf("Case %d: %d %d\n",cs++,n,ansm);continue;}
for(i=0;i<n&&arr[i].a+ansm<=m&&ansn!=n;i++)
if(i!=k) {ansm+=arr[i].a;ansn++;}
int ans_n=ansn,ans_m=ansm;
//考虑不杀有刀的人
ansn=0;ansm=0;
for(i=0;i<n&&arr[i].a+ansm<=m&&ansn!=n;i++)
{ansm+=arr[i].a;ansn++;}
if(ans_n>ansn||(ans_n==ansn&&ans_m<ansm))
printf("Case %d: %d %d\n",cs++,ans_n,ans_m);
else
printf("Case %d: %d %d\n",cs++,ansn,ansm);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: