CF23C Solution
题解
将箱子按照\(a_i\)升序排序,将其如→\((a_1,a_2),(a_3,a_4),\cdots,(a_{n-2},a_{n-1}),(a_n)\)两两分组。可以发现每个括号中选择一个元素,和一定大于一半。小证明:如果全部选择\(a_1,a_3,a_5,\cdots,a_{n-2},a_n\)(最小的选择),则\(a_n\ge a_{n-1},a_{n-2}\ge a_{n-3},\cdots ,a_3\ge a_2\),并另多一个\(a_1\)。因此我们每次选择括号中\(o_i\)较大的一项,易得这样便同时满足选出的\(a,o\)之和均大于一半。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
struct node {int a,o,id;} b[2*N];
bool cmp(node x,node y) {return x.a<y.a;}
int main()
{
int t,n,cnt1,cnt2;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<2*n;i++) {scanf("%d%d",&b[i].a,&b[i].o); b[i].id=i;}
sort(b+1,b+2*n,cmp);
printf("YES\n");
for(int i=1;i<2*n-1;i+=2)
{
if(b[i].o>b[i+1].o) printf("%d ",b[i].id);
else printf("%d ",b[i+1].id);
}
printf("%d\n",b[2*n-1].id);
}
return 0;
}