1. 程式人生 > >HDOJ-1052 Tian Ji -- The Horse Racing(貪心演算法)

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; }