【貪心演算法】田忌賽馬問題程式碼和註釋
描述
田忌與齊王賽馬,雙方各有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;
}