( 其他演算法與技巧 )【 田忌賽馬問題 】選手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 日 ...