zoukankan      html  css  js  c++  java
  • 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
    每一个不曾刷题的日子 都是对生命的辜负 从弱小到强大,需要一段时间的沉淀,就是现在了 ~buerdepepeqi
  • 相关阅读:
    经典问题的非经典解法
    经典问题之树的深度
    35、AndroidView的滑动方式
    30、Android属性动画
    31、Android矢量动画
    36、AndroidCanvas画布
    27、AndroidEventBus
    28、AndroidRxjava
    32、Android事件分发机制
    29、Android基本动画
  • 原文地址:https://www.cnblogs.com/buerdepepeqi/p/9513687.html
Copyright © 2011-2022 走看看