用c个硬币或者d个钻石购买两个喷泉,使得构造到的喷泉的美化值最大并求出美化值。
贪心,对喷泉的美化值排序,判断CC,CD,DD三种情况即可。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e5+10;
struct spring{
int beauty;
int cost;
char type;
};
spring f[N];
bool cmp1(spring a,spring b){
if(a.beauty==b.beauty)
return a.cost<b.cost;
return a.beauty>b.beauty;
}
int main(){
int n,c,d;
while(~scanf("%d%d%d",&n,&c,&d)){
for(int i=0;i<n;i++)
scanf("%d %d %c",&f[i].beauty,&f[i].cost,&f[i].type);
sort(f,f+n,cmp1);
int ans=0,sumb;
for(int i=0;i<n;i++){
sumb=0;
int costc=c,costd=d;
if(f[i].type=='C'&&f[i].cost>costc) continue;
if(f[i].type=='D'&&f[i].cost>costd) continue;
if(f[i].type=='C'&&f[i].cost<=costc){
costc-=f[i].cost;
sumb+=f[i].beauty;
}
if(f[i].type=='D'&&f[i].cost<=costd){
costd-=f[i].cost;
sumb+=f[i].beauty;
}
for(int j=i+1;j<n;j++){
if(f[j].type=='C'&&f[j].cost<=costc){
sumb+=f[j].beauty;
ans=max(ans,sumb);
break;
}
if(f[j].type=='D'&&f[j].cost<=costd){
sumb+=f[j].beauty;
ans=max(ans,sumb);
break;
}
}
}
printf("%d\n",ans);
}
return 0;
}