1. 程式人生 > 其它 >【題解】田忌賽馬(貪心)

【題解】田忌賽馬(貪心)

典型貪心,可惜我太菜想好久

題目描述

賽馬是一古老的遊戲,早在公元前四世紀的中國,處在諸侯割據的狀態,歷史上稱為 “戰國時期”。在魏國作官的孫臏,因為受到同僚龐涓的迫害,被齊國使臣救出後,到達齊國國都。

賽馬是當時最受齊國貴族歡迎的娛樂專案。上至國王,下到大臣,常常以賽馬取樂,並以重金賭輸贏。田忌多次與國王及其他大臣賭輸贏,屢賭屢輸。一天他賽馬又輸了,回家後悶悶不樂。孫臏安慰他說:“下次有機會帶我到馬場看看,也許我能幫你。”

孫臏仔細觀察後發現,田忌的馬和其他人的馬相差並不遠,只是策略運用不當,以致失敗。

比賽前田忌按照孫臏的主意,用上等馬鞍將下等馬裝飾起來,冒充上等馬,與齊王的上等馬比賽。第二場比賽,還是按照孫臏的安排,田忌用自己的上等馬與國王的中等馬比賽,在一片喝彩中,只見田忌的馬竟然衝到齊王的馬前面,贏了第二場。關鍵的第三場,田忌的中等馬和國王的下等馬比賽,田忌的馬又一次衝到國王的馬前面,結果二比一,田忌贏了國王。

不過多久,國王又找到田忌賽馬,這次國王和田忌都準備了 n 匹馬,每匹馬都有恆定的速度,所以速度大的馬一定比速度小的馬先到終點(沒有意外!!)。每場比賽國王會先出一匹沒有出戰過的馬,然後田忌再選擇一匹沒有出戰過的馬進行對戰。這次田忌找你幫忙,你最多能幫田忌贏得幾場比賽(平局不算贏)。

輸入格式

輸入資料包含三行。

第一行輸入 n(1 <= N <= 1000),表示馬的數量。

第二行有 n 個整數,即田忌的 n 匹馬的速度。

第三行有 n 個整數,即國王的 n 匹馬的速度。

馬的速度大於 0 小於等於 1000。

輸出格式

輸出通過你的精心安排,最多能贏得多少場比賽。

分析及程式碼實現

首先將兩個存放速度的陣列排列;
然後分別記錄下當前陣列中最大速度的位置

最小速度的位置

接下來進行分析:

  1. 如果田忌最快的馬比齊王最快的馬快,就比,則勝場加一,再將這兩匹馬從當前陣列中去除
  2. 如果田忌最快的馬比齊王最快的馬慢,就用田忌最慢的馬 V S齊王最快的馬,此時雖然不能勝利,但是可以用最大的價效比消耗齊王,再將這兩匹馬從當前陣列中去除
  3. 如果田忌最快的馬和齊王最快的馬速度一樣,那就觀察田忌最慢的馬與齊王最慢的馬之間的關係:
  • 田忌最慢 > 齊王最慢,就比,則勝場加一,再將這兩匹馬從當前陣列中去除
  • 田忌最慢 <= 齊王最慢,就用田忌最慢 VS 齊王最快的馬,再將這兩匹馬從當前陣列中去除

c++程式碼實現

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 1010;
int tian[N], wang[N];

int main()
{
	int n, cnt = 0;
	cin >> n;
	for (int i = 0; i < n; i++) scanf("%d", &tian[i]);
	for (int i = 0; i < n; i++) scanf("%d", &wang[i]);
	
	sort(tian, tian + n);//升序
	sort(wang, wang + n);

	int lt = 0, lw = 0, rt = n - 1, rw = n - 1;
	for (int i = 0; i < n;i++){
		if (tian[rt] > wang[rw])
			cnt++, rt--, rw--;
		else if(tian[rt] < wang[rw])
			lt++, rw--;
		else{
			if(tian[lt]>wang[lw])
				cnt++, lt++, lw++;
			else
				lt++, rw--;
		}
	}
	cout << cnt << endl;
	return 0;
}