zoukankan      html  css  js  c++  java
  • C

    题目链接:http://codeforces.com/problemset/problem/23/C

    In 2N - 1 boxes there are apples and oranges. Your task is to choose N boxes so, that they will contain not less than half of all the apples and not less than half of all the oranges.

    Input

    The first input line contains one number T — amount of tests. The description of each test starts with a natural number N — amount of boxes. Each of the following 2N - 1 lines contains numbers ai and oi — amount of apples and oranges in the i-th box (0 ≤ ai, oi ≤ 109). The sum of N in all the tests in the input doesn't exceed 105. All the input numbers are integer.

    Output

    For each test output two lines. In the first line output YES, if it's possible to choose N boxes, or NO otherwise. If the answer is positive output in the second line N numbers — indexes of the chosen boxes. Boxes are numbered from 1 in the input order. Otherwise leave the second line empty. Separate the numbers with one space.

    Examples

    Input
    2
    2
    10 15
    5 7
    20 18
    1
    0 0
    Output
    YES
    1 3
    YES
    1
    题意:
    输入一个n (n <= 1e5), 表示接下来有 2*n-1 个盒子, 每个盒子有 a 个橘子和 b 个苹果, 现在要求你从 2*n-1 个盒子中选出 n 个盒子
    使这 n 个盒子里的橘子的总数不小于橘子总数的一半, 苹果的总数不小于苹果总数的一半
    思路:按照苹果数从小到大排序 ,每两个选择一个盒子,比如有七个盒子,排序好之后
    12中选一个 34中选一个 56选一个,再加上最后一个,这样苹果数一定大于等于一半,那么我们怎么保证橙子也超过一半呢,可以这样,每两个中选中橙子多的那个盒子
    这样就满足橙子数大于等于一半了
    看代码:
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<map>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<map>
    #include<queue>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    typedef unsigned long long ull;
    #define sc1(a) scanf("%lld",&a)
    #define pf1(a) printf("%lld
    ",a)
    #define lson l,mid,rt<<1
    #define rson mid+1,r,rt<<1|1
    const LL INF=1e18;
    const ull base=2333;
    const int maxn=1e5+55;
    const int maxm=1e4+50;
    const int maxv=1e6+5;
    const int maxk=1e8+5;
    const int mod=1e9+7;
    struct Node
    {
        LL a,b,id;
        Node(){}
        Node(LL a1,LL b1,LL id1)
        {
            a=a1;b=b1;id=id1;
        }
        bool operator < (const Node x) const
        {
            return a<x.a;
        }
    }box[maxn*2];
    int main()
    {
        LL T;cin>>T;
        LL N;
        while(T--)
        {
            cin>>N;
            for(LL i=1;i<=2*N-1;i++)
            {
                sc1(box[i].a);sc1(box[i].b);
                box[i].id=i;
            }
            sort(box+1,box+1+2*N-1);
            printf("YES
    ");
            for(LL i=1;i+1<=2*N-1;i+=2)
            {
                if(box[i].b<box[i+1].b)
                {
                    printf("%lld ",box[i+1].id);
                }
                else printf("%lld ",box[i].id);
            }
            printf("%lld
    ",box[2*N-1].id);
        }
        return 0;
    }
    /**
    
    */
  • 相关阅读:
    实现不限层级的Element的NavMenu
    vue_插槽的理解和使用
    vue 动态修改路由参数
    什么是回流,什么是重绘,有什么区别?
    Vue路由获取路由参数
    【前端图表】echarts实现散点图x轴时间轴
    为什么 char 数组比 String 更适合存储密码?
    MySQL 日期时间类型怎么选?千万不要乱用!
    MySQL not exists 真的不走索引么?
    谷歌开源的代码评审规范,值得借鉴!
  • 原文地址:https://www.cnblogs.com/caijiaming/p/12632281.html
Copyright © 2011-2022 走看看