传送门:https://codeforces.com/problemset/problem/798/D
题意:给你两个长度相同的数组A和B,你要从A中取出不超过【n/2】+1的数使相同位置的a[i]的累加和与相同位置的b[i]的累加和的两倍大于A整个数组的和和B整个数组的和
题解:一开始想复杂了用线段树写了半天,其实这个就是一个简单的构造,因为如果要使得选出来的和大于整个数组的一半的话并且满足A取了后B也满足该性质,那么我们先按照从大到小把A排序后,从最大的开始隔两个的取,比较b[i]和b[i+1]的大小,把大的位置往答案的数组里面放即可,因为是隔两个取一个,最后得到的答案的数量就肯定小于题目的要求
代码如下:
#include<bits/stdc++.h> using namespace std; const int maxn = 2e5+5; int a[maxn]; int b[maxn]; int id[maxn]; vector<int> ans; bool cmp(int x,int y){ return a[x]>a[y]; } int main(){ int n; while(~scanf("%d",&n)){ ans.clear(); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); id[i]=i; } for(int i=1;i<=n;i++){ scanf("%d",&b[i]); } sort(id+1,id+n+1,cmp); ans.push_back(id[1]); for(int i=2;i<=n;i+=2){ int pos=id[i]; if(i+1<=n&&b[id[i+1]]>b[pos]){ pos=id[i+1]; } ans.push_back(pos); } cout<<ans.size()<<endl; for(int i=0;i<ans.size();i++){ cout<<ans[i]<<" "; } cout<<endl; } }