把所有的(2n+1)张牌按照(a)排序,然后去掉最大的一张,从每两个一对里选择一个(b)较大的,最后再加上最大的那个即可。
至于正确性,就算最坏是每一对里都选择了(a)小的那张。比如有(5)张,然后排完序最大的是(1).(2,3)配对,(4,5)配对。最后选了(5,3).但是这样的话,按照(1,2)配对,(3,4)配对去看,会发现依旧是选的(a)总和更大。所以可行。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e5+1;
int n;
struct E{int a,b,id;}x[maxn<<2];
bool Cmp1(E u,E v){return u.a>v.a;}
signed main(){
freopen("grandmaster.in","r",stdin);
freopen("grandmaster.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n*2+1;i++){
scanf("%d%d",&x[i].a,&x[i].b);
x[i].id=i;
}
sort(x+1,x+n*2+1+1,Cmp1);
for(int i=2;i<=2*n+1;i+=2){
if(x[i].b>x[i+1].b)printf("%d
",x[i].id);
else printf("%d
",x[i+1].id);
}
printf("%d
",x[1].id);
return 0;
}