Mike and distribution CodeForces - 798D

http://codeforces.com/problemset/problem/798/D

存结构体 对a排序 然后两个两个的选 选i和i+1中b值大的 这样保证了大于b的一半 又因为选 n/2+1(向下取整)多出来的肯定先把a中最大的选了 至于为什么可以考虑最怀情况 即二选一时被选的下标在a中总是对应小值 但如果先把a中最大的一个或两个选掉 就变成二选一总选最大的了 即[小大][小大]...[小大]转为[大小][大小][大小]...[大] 必然也是满足大于一半的

#include <bits/stdc++.h>
using namespace std;

struct node
{
    int id;
    int a;
    int b;
};

node ary[100010];
int ans[50010];
int n,len;

bool cmp(node n1,node n2)
{
    return n1.a<n2.a;
}

int main()
{
    int i;
    scanf("%d",&n);
    for(i=1;i<=n;i++) ary[i].id=i;
    for(i=1;i<=n;i++) scanf("%d",&ary[i].a);
    for(i=1;i<=n;i++) scanf("%d",&ary[i].b);
    sort(ary+1,ary+n+1,cmp);
    if(n%2)
    {
        ans[1]=ary[n].id;
        len=1;
        for(i=1;i<=n-1;i+=2)
        {
            if(ary[i].b>ary[i+1].b) ans[++len]=ary[i].id;
            else ans[++len]=ary[i+1].id;
        }
    }
    else
    {
        ans[1]=ary[n].id,ans[2]=ary[n-1].id;
        len=2;
        for(i=1;i<=n-2;i+=2)
        {
            if(ary[i].b>ary[i+1].b) ans[++len]=ary[i].id;
            else ans[++len]=ary[i+1].id;
        }
    }
    printf("%d\n",len);
    for(i=1;i<=len;i++) printf("%d ",ans[i]);
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/82532452