ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

cf23C Oranges and Apples(很好的贪心题)

2020-10-10 20:02:04  阅读:278  来源: 互联网

标签:node int cf23C Oranges st a3 Apples 橘子 苹果


地址:https://vjudge.net/problem/CodeForces-23C/origin

题意:

n

给出2*n-1个箱子,分别含有a个苹果,o个橘子

能否找出n个箱子,保证其可装的苹果不少于总苹果数一半,橘子不少于总橘子数一半。

解析:

经过分析,答案是一定存在的。

先按苹果数从小到大排序。

令第2*n-1个必拿。

假设2*n-1==7

a1,a2,a3,a4,a5,a6,a7

两两相比(苹果已经排好序,按橘子比较),a1和a2,a3和a4.......

那么这种拿法,一定能保证苹果>=suma/2。

假设拿了a1+a3+a6+a7,那么剩的是a2+a4+a5,前者一定大于后者,一定>=suma/2

不管怎么拿,只要保证两两拿一个,一定可以满足。

同理,对于橘子也是一样,两两取橘子数较大的那个,一定能保证>=sumo/2;

#include <bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn =1e6+30;
struct node
{
    int a,o,id;
}st[maxn];
int n;
bool cmp(node a,node b)
{
    return a.a<b.a;
}
void solve()
{
    cin>>n;
    for(int i=1;i<=2*n-1;i++)
    {
        cin>>st[i].a>>st[i].o;
        st[i].id=i;
    }
    sort(st+1,st+1+2*n-1,cmp);
    cout<<"YES"<<endl;
    for(int i=2;i<=2*n-1;i+=2)
    {
        if(st[i].o>st[i-1].o)
        {
            cout<<st[i].id<<" ";
        }
        else
            cout<<st[i-1].id<<" ";
    }
    cout<<st[2*n-1].id<<endl;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        solve();
    }
    
}

 

标签:node,int,cf23C,Oranges,st,a3,Apples,橘子,苹果
来源: https://www.cnblogs.com/liyexin/p/13794939.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有