题目链接: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; }