經典算法---淵子賽馬

描述

賽馬是一古老的遊戲,早在公元前四世紀的中國,處在諸侯割據的狀態,歷史上稱爲“戰國時期”。在魏國作官的孫臏,因爲受到同僚龐涓的迫害,被齊國使臣救出後,到達齊國國都。 
賽馬是當時最受齊國貴族歡迎的娛樂項目。上至國王,下到大臣,常常以賽馬取樂,並以重金賭輸贏。田忌多次與國王及其他大臣賭輸贏,屢賭屢輸。一天他賽馬又輸了,回家後悶悶不樂。孫臏安慰他說:“下次有機會帶我到馬場看看,也許我能幫你。” 
孫臏仔細觀察後發現,田忌的馬和其他人的馬相差並不遠,只是策略運用不當,以致失敗。 
比賽前田忌按照孫臏的主意,用上等馬鞍將下等馬裝飾起來,冒充上等馬,與齊王的上等馬比賽。第二場比賽,還是按照孫臏的安排,田忌用自己的上等馬與國王的中等馬比賽,在一片喝彩中,只見田忌的馬竟然衝到齊王的馬前面,贏了第二場。關鍵的第三場,田忌的中等馬和國王的下等馬比賽,田忌的馬又一次衝到國王的馬前面,結果二比一,田忌贏了國王。 
就是這麼簡單,現在淵子也來賽一賽馬。假設每匹馬都有恆定的速度,所以速度大的馬一定比速度小的馬先到終點(沒有意外!!)。不允許出現平局。最後誰贏的場數多於一半(不包括一半),誰就是贏家(可能沒有贏家)。淵子有N(1≤N≤1000)匹馬參加比賽。對手的馬的數量與淵子馬的數量一樣,並且知道所有的馬的速度。聰明的你來預測一下這場世紀之戰的結果,看看淵子能否贏得比賽。

輸入

輸入有多組測試數據。 
每組測試數據包括3行: 
第一行輸入N(1≤N≤1000)。表示馬的數量。 
第二行有N個整型數字,即淵子的N匹馬的速度。 
第三行有N個整型數字,即對手的N匹馬的速度。 
當N爲0時退出。

輸出

若通過聰明的你精心安排,如果淵子能贏得比賽,那麼輸出“YES”。 
否則輸出“NO”。

樣例輸入

5
2 3 3 4 5
1 2 3 4 5
4
2 2 1 2
2 2 3 1
0

樣例輸出

YES
NO

#include <stdio.h>

//對數組進行輸入
void inPut(int a[],int n)
{

        int
 i;
        for
(i=0;i<n;i++)
        {

            scanf("%d",&a[i]);
        }
}
 
 

//使用冒泡排序,將兩人的馬按速度從小到大進行排序。
void sort(int a[],int n)
{

    int
 i,j,t;
    for
(i=1;i<n;i++)
    {

        for
(j=0;j<n-i;j++)
        {

            if
(a[j]>a[j+1])
            {

                t=a[j+1];
                a[j+1]=a[j];
                a[j]=t;
            }
        }    
    }
}
 

int
 main()
{

    int
 n,i,a[1002],b[1002],t_max,t_min,q_max,q_min,win; 
    double
 h;
    while
(scanf("%d",&n)!=EOF&&n!=0)
    {

            //輸入數據 
            inPut(a,n);
            inPut(b,n);
            //從小到大排序 
            sort(a,n);
            sort(b,n);
            //定義齊王和田忌的信息

            //

//田忌的馬的最大速度與最小速度

            t_max=n-1;

            t_min=0;

//齊王的馬的最大速度與最小速度

            q_max=n-1;

            q_min=0;

//田忌勝利的局數

             win=0;

//比較n次

         for(i=0;i<n;i++)
         {

          //將田忌速度最小的馬和齊王速度最小的馬進行比較

//如果齊王贏,進行下一輪一比較,將雙方的角標加一,勝利的次數加一

             if(a[t_min]>b[q_min])
             {

                 t_min++;
                 q_min++;
                 win++;

             }

//如果田忌最小的馬速度小於齊王,則隱形的將田忌速度最小的馬與齊王速度最大的馬進行比較,將田忌角標加一,齊王角標減一。

             else if(a[t_min]<b[q_min])
             {

                 t_min++;
                 q_max--; 
             }

             else
 

             {

//如果齊王和田忌最小速度的兩匹馬速度相同,則比較他兩速度最大的兩匹馬。

//如果田忌最大速度的馬比齊王快。則將雙方角標減一,勝利次數加一

                 if(a[t_max]>b[q_max])
                 {

                     t_max--;
                     q_max--;
                     win++;
                 }

             //如果田忌最大速度的馬比齊王慢。則將齊王角標減一,田忌角標加一
                 else if
(a[t_max]<b[q_max])
                 {

                     q_max--;
                     t_min++;

                 }

//如果兩人速度最大的馬的速度相等,則將田忌最小速度和齊王最大速度比較,田忌角標加一,齊王角標減一

                 else
                 {

                     if
(a[t_min]<a[q_max])
                     {

                         t_min++;
                         q_max--;
                     }
                 }
             }

         }

//如果田忌勝利的次數大於所有次數的一半,則輸出yes,否則no

         h=n/2;
        if
(win>h)
        printf("YES\n");
        else
 printf("NO\n");
    }

    return
 0;
}
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章