CF23C题解

注:本题解在洛谷题解中发布过,为作者本人。

解题思路:

首先我们看到要求 2N−12N-12N1 中选择 NNN 个,且两种水果选择在总量的一半以上,可以猜想在所有情况中,均至少有一组解,不过一个正确的结论是需要严谨的证明的。

我们可以将 aaa 数组从小到大排序,得到有序数组 a1,a2,…,a2N−1a_1,a_2,\dots ,a_{2N-1}a1,a2,,a2N1。因为数组有序,所以很容易知道:
a3≥a2,a5≥a4,…,a2N−1≥a2N−2a_3\geq a_2,a_5\geq a_4,\dots ,a_{2N-1}\geq a_{2N-2}a3a2,a5a4,,a2N1a2N2
由此可得:
a1+a3+a5+⋯+a2N−1≥a2+a4+a6+⋯+a2N−2a_1+a_3+a_5+\dots+a_{2N-1}\geq a_2+a_4+a_6+\dots+a_{2N-2}a1+a3+a5++a2N1a2+a4+a6++a2N2
同理可以得到:
a2+a4+⋯+a2N−2+a2N−1≥a1+a3+⋯+a2N−3a_2+a_4+\dots+a_{2N-2}+a_{2N-1}\geq a_1+a_3+\dots+a_{2N-3}a2+a4++a2N2+a2N1a1+a3++a2N3
如果此时:
o1+o3+o5+⋯+o2N−1≥12∑i=12N−1oio_1+o_3+o_5+\dots+o_{2N-1}\geq \frac{1}{2}\sum_{i=1}^{2N-1}o_io1+o3+o5++o2N121i=12N1oi
那么已经满足要求,即可输出所有奇数位上的元素序号。否则一定可得:
o2+o4+⋯+o2N−2+o2N−1>12∑i=12N−1oio_2+o_4+\dots+o_{2N-2}+o_{2N-1}>\frac{1}{2}\sum_{i=1}^{2N-1}o_io2+o4++o2N2+o2N1>21i=12N1oi
即可输出所有偶数位上的元素和最后一位元素的序号。由此也可以证明本题一定有解。

Code:

#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int N=2e5+5;
int t,n;
struct node{
	int id,apple,orange;
	bool operator <(const node &other) const{
		return apple<other.apple;
	}
}a[N];
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);puts("YES");int sumor=0;
		for(int i=1;i<2*n;i++){
			scanf("%lld%lld",&a[i].apple,&a[i].orange);
			a[i].id=i;sumor+=a[i].orange;
		}sort(a+1,a+2*n);int ans=0;
		for(int i=1;i<2*n;i+=2)ans+=a[i].orange;
		if(ans>=ceil(1.0*sumor/2)){
			for(int i=1;i<2*n;i+=2)printf("%lld ",a[i].id);
		}else{
			for(int i=2;i<2*n;i+=2)printf("%lld ",a[i].id);
			printf("%lld",a[2*n-1].id);
		}puts("");
	}return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值