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;
}
posted @ 2021-05-12 22:13  violet_holmes  阅读(50)  评论(1编辑  收藏  举报