Tian Ji -- The Horse Racing

题目链接:http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=16442
题意:

        田忌赛马问题。多组案例,以输入n值为0时结束。田忌与国王各有n匹马,进行n场比赛,规定每匹马只能上场一次,每场比赛获胜则获得200金币,否则扣除200金币。给定双方马速,求田忌最多获取多少金币。
案例:

       Sample Input
       3

       92 83 71

       95 87 74

       2

       20 20

       20 20

       2

       20 19

       22 18

       0

       Sample Output

       200

       0

       0
分析:

      贪心策略。

      将双方最慢马匹进行竞赛,

      若田忌一方马速快则获取200金币,

      若田忌一方马速慢于国王最慢的马,则用田忌最慢的马消耗国王最快的马以获取其它马匹胜利的机会

      若双方马速相等,则又需分情况讨论:先判断双方最快的马匹之间的赛果,若田忌胜则获取200金币,否则用田忌最慢马匹消耗国王最快马匹。注意!田忌最慢马匹不一定输给国王最快马匹,也可能平局。

源代码:

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 using namespace std;
 5 int n,ant,i,j;
 6 int a[1005],b[1005];
 7 void cmp()
 8 {
 9 
10     int x1=0,x2=n-1,y1=0,y2=n-1;
11     while(x1<=x2)
12     {
13         if(a[x1]>b[y1])//双方最慢的马进行比较,田忌胜
14         {
15             ant+=200;
16             x1++;
17             y1++;
18         }
19         else if(a[x1]<b[y1])//田忌输,用最慢的马与国王最快的马竞赛
20         {
21             ant-=200;
22             x1++;
23             y2--;
24         }
25         else//马速相等
26         {
27             if(a[x2]>b[y2])//双方最快的马进行竞赛,田忌胜
28             {
29                 ant+=200;
30                 x2--;
31                 y2--;
32             }
33             else
34             {
35                 if(a[x1]<b[y2])//用田最慢的马输给国王最快的马
36                    ant-=200;
37                 x1++;
38                 y2--;
39             }
40         }
41     }
42 }
43 int main()
44 {
45     while(scanf("%d",&n)&&n)
46     {
47         for(i=0;i<n;i++)
48             scanf("%d",&a[i]);//田忌方马速
49         for(i=0;i<n;i++)
50             scanf("%d",&b[i]);//国王方马速
51         sort(a,a+n);//排序
52         sort(b,b+n);
53         ant=0;//马赛前田忌拥有金币
54         cmp();
55         printf("%d
",ant);
56     }
57     return 0;
58 }
原文地址:https://www.cnblogs.com/huaszjh/p/4716362.html