题意:每个城市有1000头牛,其中各个城市又有一些“Jersey Cows”,现在要将城市均分为3份,使得至少两份Jersey Cows的数量之和超过那份区域牛总数的一半。
题解:先踢出Jersey Cows最少的K座城市,统计剩下的两份Jersey Cows数量,随机交换它们直到满足题意。

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 }