CodeForces 798D 思维,贪心

CodeForces 798D

题意:长度为 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", 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;
}
posted @ 2017-07-16 21:34  v9fly  阅读(173)  评论(0编辑  收藏  举报