1. 程式人生 > >【貪心演算法】田忌賽馬問題程式碼和註釋

【貪心演算法】田忌賽馬問題程式碼和註釋

描述
田忌與齊王賽馬,雙方各有n匹馬參賽(n<=100),每場比賽賭注為1兩黃金,現已知齊王與田忌的每匹馬的速度,並且齊王肯定是按馬的速度從快到慢出場,現要你寫一個程式幫助田忌計算他最好的結果是贏多少兩黃金(輸用負數表示)。
Tian Ji and the king play horse racing, both sides have n horse (n is no more the 100), every game a bet of 1 gold, now known king and Tian Ji each horse’s speed, and the king is definitely on the horse speed from fast to slow, we want you to write a program to help Tian Ji his best result is win the number gold (lost express with the negative number).
輸入
多個測例。
每個測例三行:第一行一個整數n,表示雙方各有n匹馬;第二行n個整數分別表示田忌的n匹馬的速度;第三行n個整數分別表示齊王的n匹馬的速度。
n=0表示輸入結束。
A plurality of test cases.
Each test case of three lines: the first line contains an integer n, said the two sides each have n horse; second lines of N integers n Tian Ji horse speed; third lines of N integers King n horse speed.
N = 0 indicates the end of input.
輸出
每行一個整數,田忌最多能贏多少兩黃金。
how many gold the tian ji win
輸入樣例
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
3
20 20 10
20 20 10
0
輸出樣例
1
0
0
0

思路:
1、先從田忌的最差的馬和齊王的最差的馬比,如果田馬速度大於齊馬,贏一場!
2、如果田忌的最差的馬比齊王最差的馬還差,讓田的最差馬和齊王最好的馬比,輸一場
3、如果田忌的最差的馬比齊王最差的馬一樣速度,則比較田忌最好的馬和齊王最好的馬:
{
(1).如果田忌最好的馬比齊王最好的馬快,贏一場。
(2).如果田忌最好的馬比齊王最好的馬慢或兩匹馬一樣快,則比較田忌最差的馬和齊王最好的馬
{
1).如果田忌的最差的馬比齊王最好的馬慢,則輸一場。
2).如果田忌最差的馬和齊王最好的馬一樣快,則贏一場。
}
}

#include<stdio.h>

int n,tianji[101],qiwang[101]; 

void sort(int m[]);
int race();

int main()
{
    while(1)
    {
        int i;

        scanf("%d",&n);
        if(n==0) return 0;

        for(i=1;i<=n;i++)
        {
            scanf("%d",&tianji[i]);
        } 
        for(i=1;i<=n;i++)
        {
            scanf("%d"
,&qiwang[i]); } sort(tianji); sort(qiwang); //將兩個人的馬都由小到大排序,方便比較 printf("%d\n",race()); } } void sort(int m[]) { int i,j,t; for(i=1;i<n;i++) { for(j=1;j<=n-i;j++) { if(m[j]>m[j+1]) { t=m[j]; m[j]=m[j+1]; m[j+1]=t; } } } } int race() { int x0=1,y0=1,x1=n,y1=n,g=0,count=0; //x0為田忌所剩的最差的馬的編號,y0為齊王所剩的最差的馬的編號; //x1為田忌所剩的最好的馬的編號,y1為齊王所剩的最好的馬的編號; //count為田忌當前贏的錢數 //g為兩人已經進行過幾場比賽 while(++g<=n)//有n匹馬,要進行n場比賽 { if(tianji[x0]>qiwang[y0]) //田忌最差的馬比齊王最差的馬快,贏一場。 //用掉了自己最差的馬,同時勝利,這是最優情況。 { count+=1; x0++; y0++; } else if(tianji[x0]<qiwang[y0]) //如果田忌最差的馬比齊王最差的馬還慢,無論策略如何都會輸一局。 //這時用田忌最差的馬和齊王最快的馬比,雖然輸了一局,但是消耗了齊王最好的馬。 { count-=1; y1--; x0++; } else if(tianji[x0]==qiwang[y0]) //當田忌最差的馬和齊王最差的馬一樣快時 //比較田忌最好的馬和齊王最好的馬,分情況討論 { if(tianji[x1]>qiwang[y1]) //如果田忌最好的馬比齊王最好的馬快,贏一局 { count+=1; x1--; y1--; } //如果田忌最好的馬比齊王最好的馬慢,用田忌最差的馬和齊王最好的馬比賽 //需要考慮到田忌最差的馬和齊王最好的馬一樣快的特殊情況 else { if(tianji[x0]==qiwang[y1]) //田忌最差的馬和齊王最好的馬一樣快,平局 { count+=0; x0++; y1--; } else //田忌最差的馬比齊王最好的馬慢,輸一局 { count-=1; x0++; y1--; } } } } return count; }