( 其他演算法與技巧 ) 田忌賽馬問題

2021-10-08 18:38:53 字數 1368 閱讀 1777

( 其他演算法與技巧 )【 田忌賽馬問題 】

選手a的馬,順序和能力都是明確的。

選手b的馬,能力是明確的,問如何安排出場順序可以贏下更多的場次。

以前一直是列舉來做,就是按照 b 選手最差的 i 匹馬去輸給 a 選手最強的馬,其他的再比較。

但是**很難實現,不是很簡潔。

今天新學的方式,先對兩個選手的馬從小到大排序,i 指標指向a選手第乙個,j 指標指向b選手第乙個,當 j 指向的馬大於 i 指向的馬說明可以贏,i++,j++,ans++ ; 否則,j 這匹馬誰也贏不了,只能去輸,j++.

// 前提是b選手可以派出馬去迎戰a選手的任意馬。就是b有主動權

int n,ans=0;cin>>n;

for ( int i=0; ia[i] )

else j++;

}cout << ans << endl; // b能贏得最大局數

例題:gym - 102082k 

題意:ab選手都有n批馬。給出a選手的馬的能力值和出場順序。給出b選手的馬的能力值。問怎麼安排b選手的出場順序才能保證b選手贏下的場次最多。場次一樣的的排序輸出字典序較大的。

思路:根據上面的講解,很容易能得到可以贏下的最大場次,排序方式如果是任意的話也可以很容易得到。但是要求字典序最大,這是這道題的難點。

這是乙個在某個條件下找最大的情況。一般用二分來做。for迴圈 第 i 批馬 ,二分b序列,check b序列的第 j 批馬如果和 i 批馬匹配,剩下的馬是否還能保證贏下的場次最多。

**:

#include#define int long long

using namespace std;

int n;

vectora,b;

int a[5005],b[5005],ans;

vectortb,ta;

int v[5005],pre;

int check()

else j++;

}return now;

}signed main()

else j++;

}for ( int i=0; iif ( pre+1+check()==ans )

else r=mid-1;

}if ( res==-1 )

if ( pre+check()==ans )

else r=mid-1;}}

else pre++;

cout << b[res] << " ";

b.erase( b.begin()+res );

// for ( int i=0; i}

return 0;

}

田忌賽馬貪心演算法 田忌賽馬問題 貪心演算法

關於輸入 輸入包含多組測試資料.每組測試資料的第一行是乙個整數n 1 n 1000 表示田忌和齊王都擁有n匹馬。接下來一行是n個整數,表示田忌的馬的速度,下一行也是n個整數,表示齊王的馬的速度。輸入的最後以乙個0表示結束。關於輸出 對每組資料,如果田忌能贏則輸出 win 如果田忌能輸則輸出 lose...

田忌賽馬貪心演算法 貪心演算法 田忌賽馬問題

題目描述 你一定聽過田忌賽馬的故事吧?如果3匹馬變成1000匹,齊王仍然讓他的馬按從優到劣的順序出賽,田忌可以按任意順序選擇他的賽馬出賽。贏一局,田忌可以得到200兩銀子,輸一局,田忌就要輸掉200兩銀子,平局的話不輸不贏。請問田忌最多能贏多少銀子?關於輸入 輸入包含多組測試資料.每組測試資料的第一...

田忌賽馬貪心演算法 貪心演算法解決田忌賽馬

田忌賽馬 對策問題 教學目標 1 通過簡單的事例,使學生初步體會對策論在解決.梁錦美有無課件 上課時間 有 12 月 15 日 1 田忌賽馬中的數學問題 課時.同學們,你聽過 田忌賽馬 的故事嗎?第一次賽馬 上 上 中 中 下 田忌 下齊.上課周次 十六 有無課件 上課時間 有 12 月 15 日 ...