HDOJ-1052 Tian Ji -- The Horse Racing(貪心演算法)
題目描述:就是田忌賽馬,但是要注意兩邊存在馬速度相同的情況。
分析: (看了各路大佬的題解Orz,自我總結一下)
先排序,這裡從快到慢排序;
1.田忌最快馬>王最快馬(貪心,毫無疑問,進行比賽後獲勝)
2.田忌最快馬<王最快馬(同樣的,既然贏不了,用最慢馬去消耗掉最快馬)
3.田忌最快馬=王最快馬(要比較兩者最慢馬,因為沒考慮這個WA了很多次…)
a.田忌最慢馬>王最慢馬
田忌:90 60
王:90 50
①60-90 90-50 贏一場,輸一場
②90-90 60-50 平一場,贏一場
顯然方案②更優,以貪心而言,能贏一場是一場,先讓最慢馬進行比賽,相等的最快馬留給下一次判斷。(再判斷下一對最慢馬)
b.田忌最慢馬<王最慢馬
田忌:90 40
王:90 70
①90-90 40-50 平一場,輸一場
②40-90 90-70 贏一場,輸一場
顯然方案②更優,既然最慢馬也比不過,那就只能用來消耗其相等的最快馬,讓田忌的最快馬保留。
c. 田忌最慢馬=王最慢馬(最坑的來了,又因為沒分析清楚這個繼續WA了很多次…)
一開始直接用兩個資料分析
田忌:90 70
王:90 70
①90-90 70-70 ②90-70 70-90 效果一樣唉(遂WA)
試了試三個
田忌:90 80 60
王:90 70 60
①90-90 60-60 80-70 贏一場,平兩場
②60-90 90-70 80-60 贏兩場,平一場
根據貪心,覺得與其讓最慢馬去消耗,輸一場,不如讓相同的最慢馬平一場,但是這裡又不能這樣貪心,因為可能消耗掉王的當前最快馬的效益更高,而且田忌的最快馬還在,(不相等時)至少可以贏王的最慢馬,分數依舊打平。
*這裡還有一個點:*就是用田忌的最慢馬去消耗王的最快馬時田忌不一定會輸!
例如:田忌:90 90 90
王:90 90 90
此時加一個特判,當相等時直接break;結束
以下AC程式碼
#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a, int b)
{
return a > b;
}
int main()
{
int Tianji[1001], King[1001], i,n;
while (1)
{
cin >> n;
if (n == 0)
break;
for (i = 0; i < n; i++)
cin >> Tianji[i];
sort(Tianji, Tianji + n, cmp);
for (i = 0; i < n; i++)
cin >> King[i];
sort(King, King + n, cmp);
int ans=0;
int fast1 = 0, slow1 = n - 1;
int fast2 = 0, slow2 = n - 1;
while (fast1 <= slow1&&fast2 <= slow2)
{
if (Tianji[fast1] > King[fast2]) //情況1
{
ans += 200;
fast1++;
fast2++;
}
else if (Tianji[fast1] < King[fast2]) //情況2
{
slow1--;
fast2++;
ans -= 200;
}
else
{
if (Tianji[slow1] > King[slow2]) //情況3-a
{
slow1--;
slow2--;
ans += 200;
}
else if(Tianji[slow1]<King[slow2]) //情況3-b
{
slow1--;
fast2++;
ans -= 200;
}
else //情況3-c
{
if (Tianji[slow1] < King[fast2])
{
slow1--;
fast2++;
ans -= 200;
}
else //特判
break;
}
}
}
cout << ans << endl;
}
return 0;
}