codeforces 798D

传送门: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;
    }
}
View Code

 

posted @ 2018-08-21 20:13  buerdepepeqi  阅读(123)  评论(0编辑  收藏  举报