杭电 ACM Step(3)

Tian Ji – The Horse Racing

杭电 ACM Step(3)_第1张图片
杭电 ACM Step(3)_第2张图片
杭电 ACM Step(3)_第3张图片

题目求解

  1. 让田忌最慢的马和齐王最慢的马相比,如果田忌最慢的马比齐王最慢的马快,先让田忌赢一场。因为在这种情况下,田忌所有的马都比齐王最慢的马快,所以用一个最慢的马和齐王最慢的马比,减少田忌的损耗。
  2. 如果田忌最慢的马比齐王最慢的马慢,则用田忌最慢的马和齐王最快的马相比,让田忌输一场。在这种情况下,田忌用最慢的马拼掉齐王最快的马。
  3. 当田忌最慢的马和齐王最慢的马速度一样时
    • 如果田忌最快的马比齐王最快的马快,先让田忌赢一场
    • 田忌最快的马比齐王最快的马慢,用田忌最慢的马与齐王最快的马比,田忌输一场。
    • 田忌和齐王最快的马一样快时
      • 田忌最慢的马比齐王最快的马慢,则先让田忌输一场
      • 其余情况则说明田忌和齐王还未安排比赛的所有的马的速度都一样。所以田忌不输不赢。

总体思想

  • 贪心算法:局部最优,你的每一步都是最优的,不需要遍历全部找最优。

实现代码

#include 
void SelectSort(int s[],int N)
{
    int flag;
    int t;
    for(int i=0;ifor(int j=i+1;jif(s[j]int main()
{
    int T;
    int A[1000];
    int B[1000];
    while(scanf("%d",&T),T)
    {
        for(int i=0;iscanf("%d",&A[i]);
        for(int i=0;iscanf("%d",&B[i]);
        SelectSort(A,T);
        SelectSort(B,T);
        int win=0;
        int k=T-1;
        int j=0;
        for(int i=0;iif(A[i]>B[j]) //如果A最慢的马比B最慢的马快,先让A赢一局
            {
                i++;//A和B最慢的马都提高一个档次
                j++;
                win++;
            }
            else if(A[i]//如果A最慢的马比B最慢的马慢,和B最快的马比,A输一场
            {
                k--;//B最快的马降低一个档次
                i++;//A最慢的马提高一个档次
                win--;
            }
            else //A和B最慢的马一样慢
            {
                if(A[T-1]>B[k])//A最快的马比B最快的马快时,A赢一场
                {
                    win++;
                    T--;//A最快的马变为次一档
                    k--;//B最快的马变为次一档
                }
                else if(A[T-1]//A最快的马比B最快的马慢时,A用最慢的马和B最快的马比,输一场
                {
                    win--;
                    k--;//B最快的马降低一个档次
                    i++;//A最慢的马提高一个档次
                }
                else//A和B最快的马一样快,A最慢的马和B最快的马比,输一场
                {
                    if(A[i]//其余情况则表明A所有的马都一样快了
                    //则A最慢的马和B最快的马速度一样,不输不赢
                    k--;
                }
            }
        }
        printf("%d\n",win*200);
    }
    return 0;
}

你可能感兴趣的:(杭电练习)