题意:每个城市有1000头牛,其中各个城市又有一些“Jersey Cows”,现在要将城市均分为3份,使得至少两份Jersey Cows的数量之和超过那份区域牛总数的一半。

题解:先踢出Jersey Cows最少的K座城市,统计剩下的两份Jersey Cows数量,随机交换它们直到满足题意。

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<ctime>
 5 #include<cstdlib>
 6 using namespace std;
 7 struct Data
 8 {
 9     int id,num;
10 } po[200];
11 bool comp(Data a,Data b)
12 {
13     if(a.num!=b.num)
14         return a.num<b.num;
15     else
16         return a.id<b.id;
17 };
18 int main()
19 {
20     int nu;
21     while(scanf("%d",&nu)!=EOF)
22     {
23         int n=nu*3;
24         for(int i=0; i<n; i++)
25         {
26             scanf("%d",&po[i].num);
27             po[i].id=i+1;
28         }
29         sort(po,po+n,comp);
30         for(int i=0; i<nu; i++)
31             printf("%d\n",po[i].id);
32         int sum1=0,sum2=0,ne=nu*500;
33         for(int i=0; i<nu; i++)
34         {
35             sum1+=po[i+nu].num;
36             sum2+=po[i+2*nu].num;
37         }
38         srand(clock());
39         while(sum1<=ne||sum2<=ne)
40         {
41             int x=rand()%nu,y=rand()%nu;
42             sum1=sum1-po[x+nu].num+po[y+nu*2].num;
43             sum2=sum2-po[y+nu*2].num+po[x+nu].num;
44             swap(po[x+nu],po[y+nu*2]);
45         }
46         for(int i=0;i<nu;i++)
47             printf("%d\n",po[i+nu].id);
48         for(int i=0;i<nu;i++)
49             printf("%d\n",po[i+2*nu].id);
50     }
51     return 0;
52 }