CF410div2 D. Mike and distribution
1 /* 2 CF410div2 D. Mike and distribution 3 http://codeforces.com/contest/798/problem/D 4 构造 5 题意:给出两个数列a,b,求选出n/2+1个数对,使得其和的二倍大于各自的数列 6 思路:对数列a进行排序,因为可以选一半加1个,所以最大的那个我们选出来 7 然后在剩下的数列中,每隔两个选则b中较大的, 8 这样可以保证选出的在b中满足条件,并且在a中也满足条件 9 然而。。。。我他喵的居然忘了读入b数列!!!! 10 */ 11 #include <cstdio> 12 #include <algorithm> 13 #include <cstring> 14 #include <cmath> 15 #include <vector> 16 #include <queue> 17 #include <iostream> 18 #include <map> 19 #include <set> 20 //#define test 21 using namespace std; 22 const int Nmax=1e6+7; 23 long long a[Nmax],b[Nmax]; 24 int m; 25 long long s1,s2; 26 long long now1,now2; 27 int book[Nmax]; 28 struct Node 29 { 30 int a; 31 int id; 32 }num[Nmax]; 33 bool cmp(Node a,Node b) 34 { 35 return a.a>b.a; 36 } 37 int ans[Nmax]; 38 int main() 39 { 40 #ifdef test 41 #endif 42 int n; 43 scanf("%d",&n); 44 for(int i=1;i<=n;i++) 45 { 46 scanf("%lld",&a[i]); 47 num[i].id=i; 48 num[i].a=a[i]; 49 } 50 for(int i=1;i<=n;i++)//忘了读入b[],真是醉了,感觉最近不适合写代码。。。 51 scanf("%lld",&b[i]); 52 sort(num+1,num+1+n,cmp); 53 int ans_size=0; 54 int i=1; 55 ans[++ans_size]=num[i++].id; 56 for(;i<=n;i+=2) 57 { 58 if(i==n) 59 { 60 ans[++ans_size]=num[i].id; 61 break; 62 } 63 if(b[num[i].id]>b[num[i+1].id]) 64 ans[++ans_size]=num[i].id; 65 else 66 ans[++ans_size]=num[i+1].id; 67 } 68 printf("%d\n",ans_size); 69 for(int i=1;i<=ans_size;i++) 70 printf("%d%c",ans[i],i==ans_size?'\n':' '); 71 return 0; 72 }