题意:长度为 n的两个数组 a[]和 b[],要找出 k ( k<=n/2+1 )个下标,使得在两个数组中这 k个数的和乘上 2 要大于所有数的和。
tags: 思维
按a[]数组从大到小排一下序,把 1取掉,然后后面的每 2个取b[]大的那个,这样可以保证要求。
#include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a;i<=b;i++) #define per(i,b,a) for (int i=b;i>=a;i--) #define mes(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f #define MP make_pair #define PB push_back #define fi first #define se second typedef long long ll; const int N = 200005; int n; pair<int , pair<int, int > > p[N]; int main() { scanf("%d", &n); rep(i,1,n) scanf("%d", &p[i].fi), p[i].se.se=i; rep(i,1,n) scanf("%d", &p[i].se.fi); sort(p+1, p+1+n); printf("%d ", n/2+1); printf("%d ", p[n].se.se); for(int i=n-1; i>=2; i-=2) { printf("%d ", p[i].se.fi>p[i-1].se.fi ? p[i].se.se : p[i-1].se.se); } if(n%2==0) printf("%d", p[1].se.se); puts(""); return 0; }