POJ 2454

题意:每个城市有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 }

 

 

你可能感兴趣的:(poj)