题意:有N张卡牌,每张卡牌有两个值a和b,a代表能获得的点数,b代表拿了这张卡牌后还能拿多少张卡牌,拿了一张卡牌就丢掉一张卡牌。求能获得的最大点数。
分析:对b从大到小排序,若b相等,对a从大到小排序,然后一张张拿,点数相加就可以。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//int a[1005],b[1005];
struct elem
{
int a,b;
} e[1005];
bool cmp(elem e1,elem e2)
{
if(e1.b>e2.b) return 1;
else if(e1.b==e2.b&&e1.a>e2.a) return 1;
else return 0;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i;
for(i=0;i<n;i++)
scanf("%d%d",&e[i].a,&e[i].b);
sort(e,e+n,cmp);
int cnt=1,ans=0;
for(i=0;i<n&&i<cnt;i++)
{
ans+=e[i].a;
cnt+=e[i].b;
}
printf("%d\n",ans);
}
return 0;
}