zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    【刷题】AtCoder Regular Contest 002
    【刷题】AtCoder Regular Contest 001
    【刷题】LOJ 2863 「IOI2018」组合动作
    (栈)栈 给定push序列,判断给定序列是否是pop序列
    网易面试题:和为n连续正数序列
    Google面试题:计算从1到n的正数中1出现的次数
    递归法
    打印给定字符串中字符的所有排列
    C++ 实现不能被继承的类
    atoi 实现
  • 原文地址:https://www.cnblogs.com/huaszjh/p/4716362.html
Copyright © 2011-2022 走看看