cf23C Oranges and Apples(很好的貪心題)
阿新 • • 發佈:2020-10-10
地址: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(); } }