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 }

 

posted @ 2017-04-23 09:34  BBBob  阅读(152)  评论(0编辑  收藏