标签:
http://acm.hdu.edu.cn/showproblem.php?pid=4415
2 3 5 4 1 5 1 7 7 2 1 2 2 4 0
Case 1: 3 4 Case 2: 0 0
/**
hdu4415 贪心
我考虑少了,就不说什么了……
http://m.blog.csdn.net/blog/HELLO_THERE/8016365
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=100005;
int a[maxn],b[maxn],temp[maxn];
int n,m;
int main()
{
int T,tt=0;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
int k1=0,k2=0,sword=0;
for(int i=0;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
y==0?(b[k2++]=x):(a[k1++]=x);
sword+=y;
}
sort(a,a+k1);
sort(b,b+k2);
int cost1=0,num1=0;
for(int i=0;i<k2;i++)
{
if(m-cost1>=b[i])
{
cost1+=b[i];
num1++;
}
else
break;
}
int num2=0,cost2=0;
if(m>=a[0])
{
if(sword>=n-1)
{
if(num1<n)
{
num1=n;
cost1=a[0];
}
else if(num1==n&&cost1>a[0])
{
cost1=a[0];
}
printf("Case %d: %d %d\n",++tt,num1,cost1);
continue;
}
int k=n-1-sword;
int x=1,y=0,i=0;
a[k1]=b[k2]=1000000000;
while(i<k)
{
if(a[x]<b[y])
temp[i]=a[x++];
else
temp[i]=b[y++];
i++;
}
i=0;
num2=1+sword;
cost2=a[0];
while(i<k&&cost2<=m)
{
if(num2==n)
break;
if(m-cost2>=temp[i])
{
cost2+=temp[i++];
num2++;
}
else
break;
}
}
if(num2>num1)
{
num1=num2;
cost1=cost2;
}
else if(num2==num1&&cost2<cost1)
{
cost1=cost2;
}
printf("Case %d: %d %d\n",++tt,num1,cost1);
}
return 0;
}标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/44875585