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;
    }
    /**
    
    */
  • 相关阅读:
    第二代:晶体管计算机
    第一代计算机
    Android应用在不同版本间兼容性处理
    eventBus
    realm
    ijkplayer详解AAA
    USB 3.0规范中译本 第3章 USB 3.0体系结构概览
    ES6 学习笔记
    07_通过上下文获取常见目录
    06_登陆案例保存信息完成
  • 原文地址:https://www.cnblogs.com/caijiaming/p/12632281.html
Copyright © 2011-2022 走看看