codeforces 798 D. Mike and distribution(贪心+思维)

题目链接:http://codeforces.com/contest/798/problem/D

题意:给出两串长度为n的数组a,b,然后要求长度小于等于n/2+1的p数组是的以p为下表a1~ap的和乘以2

大于a数组全部数的总和,b也是同理。

 

题解:一看到这题一般会想到贪心,由于是二维的贪心,所以一定要想让一维有序,所以可以按照a先排一下序。

得到排序后的数组a',先加上a'然后在依次两两选择b大的加上。

 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int M = 1e5 + 10;
struct TnT {
    int a , b , num;
}T[M];
bool cmp(TnT x , TnT y) {
    return x.a > y.a;
}
int main() {
    int n;
    cin >> n;
    for(int i = 0 ; i < n ; i++) {
        cin >> T[i].a;
        T[i].num = i + 1;
    }
    for(int i = 0 ; i < n ; i++) {
        cin >> T[i].b;
    }
    sort(T , T + n , cmp);
    if(n % 2 == 0) {
        cout << n / 2 + 1 << endl;
        cout << T[0].num;
        for(int i = 1 ; i < n - 2 ; i += 2) {
            if(T[i].b < T[i + 1].b) {
                cout << ' ' << T[i + 1].num;
            }
            else {
                cout << ' ' << T[i].num;
            }
        }
        cout << ' ' << T[n - 1].num << endl;
    }
    else {
        cout << n / 2 + 1 << endl;
        cout << T[0].num;
        for(int i = 1 ; i < n - 1 ; i += 2) {
            if(T[i].b < T[i + 1].b) {
                cout << ' ' << T[i + 1].num;
            }
            else {
                cout << ' ' << T[i].num;
            }
        }
        cout << endl;
    }
    return 0;
}

posted @ 2017-04-23 16:30  Gealo  阅读(335)  评论(0编辑  收藏  举报