Educational Codeforces Round 17 B. USB vs. PS/2
排序再选,最基本的贪心,注意买得到的个数就好,先满足单个的再满足both的
打比赛的时候一次过了,开心的简单题
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long int ll;
const int maxn = 100050;
ll us[3*maxn],ps[3*maxn];
int main()
{
//freopen("in.txt","r",stdin);
int a,b,c,m;
scanf("%d %d %d",&a,&b,&c);
scanf("%d",&m);
char s[20];
int ucnt = 0,pcnt = 0;
ll pri;
for(int i=0;i<m;++i)
{
scanf("%lld",&pri);
scanf("%s",s);
if(s[0]=='U')us[ucnt++]=pri;
else if(s[0]=='P')ps[pcnt++]=pri;
}
sort(us,us+ucnt);
sort(ps,ps+pcnt);
int uneed = min(ucnt,a),pneed = min(pcnt,b);
int bothneed = min(ucnt+pcnt - uneed - pneed,c);
int cnt = uneed + pneed + bothneed;
//printf("cnt = %d\n",cnt);
ll mval = 0;
for(int i=0;i < uneed;++i) mval += us[i];
for(int i=0;i < pneed;++i) mval += ps[i];
int upoint = uneed,ppoint = pneed;
for(int i=0;i < bothneed;++i){
if(upoint < ucnt && ppoint < pcnt){
if(us[upoint] < ps[ppoint]){
mval += us[upoint];
upoint++;
}else{
mval += ps[ppoint];
ppoint++;
}
}
else if(upoint < ucnt){
mval += us[upoint];
upoint++;
}
else if(ppoint < pcnt){
mval += ps[ppoint];
ppoint++;
}
}
printf("%d %lld\n",cnt,mval);
return 0;
}