1. 程式人生 > 實用技巧 >cf23C Oranges and Apples(很好的貪心題)

cf23C Oranges and 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(); } }