CodeForces 798D Mike and distribution

题目链接:http://codeforces.com/contest/798/problem/D
题意:给你两长度为n的序列a和b,让你从里面选择n/2+1个位置出来,使得这个位置上的元素的和严格大于各自序列和的二分之一,让你输出n/2+1个数,代表位置
解析:假设只给你一个数组,不让你排序,如果你要选出这样的n/2+1个位置,那是不是,两两比较选择大的那个,再随便选一个之前没选过的,这样的贪心策略是不是会使得最后的结果大过总和的二分之一,如果可以排序那就更好选了。那么现在有两个数组了,如果在根据之前的贪心策略应该是有问题的,因为会有一个数组保证不了,那么我们就把一个数组进行排序,那就相当于把一个数组固定了起来,再对另一个数组贪心处理,反正就是对a数组排序,然后一定要选a中最大的,然后对b数组就是两两比较取最大的,反正大概就是那么个意思,各种乱搞应该能出来

#include <bits/stdc++.h>
using namespace std;
const int inf = 0x7fffffff;
const int maxn = 1e5+100;
struct node
{
    int v;
    int id;
    bool operator < (const node &b)const
    {
        return v>b.v;
    }
}a[maxn];
int b[maxn];
vector<int>ans;
int main(void)
{
    int n;
    scanf("%d",&n);
    int sum1 = 0,sum2 = 0;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&a[i].v);
        sum1 += a[i].v;
        a[i].id = i;
    }
    sort(a,a+n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&b[i]);
        sum2 += b[i];
    }
    ans.push_back(a[0].id);
    for(int i=1;i<n-1;i+=2)
    {
        if(b[a[i].id]>b[a[i+1].id])
            ans.push_back(a[i].id);
        else
            ans.push_back(a[i+1].id);
    }
    printf("%d\n",n/2+1);
    if(n%2==0)
        ans.push_back(a[n-1].id);
    for(unsigned i = 0;i<ans.size();i++)
        printf("%d ",ans[i]+1);
    puts("");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值