最后贏家
時(shí)間限制:C/C++語(yǔ)言 1000MS;其他語(yǔ)言 3000MS
內(nèi)存限制:C/C++語(yǔ)言 65536KB;其他語(yǔ)言 589824KB
題目描述:
最強(qiáng)的不一定是最后的贏家。
某賽事有n名選手參加,但是不同于其他的比賽,本比賽采取的是擂臺(tái)賽的形式,n名選手排成一排,每次隊(duì)伍的第一位和第二位選手進(jìn)行比賽,輸?shù)囊环綍?huì)排到隊(duì)尾。
當(dāng)某位選手取得m連勝時(shí),他將成為最后的贏家,且游戲結(jié)束,請(qǐng)問(wèn)截止到游戲結(jié)束,共會(huì)進(jìn)行多少次比賽。
兩位選手的比賽結(jié)果由他們的戰(zhàn)斗力決定,n位選手的戰(zhàn)斗力是一個(gè)1~n的排列,也就是說(shuō)他們的戰(zhàn)斗力兩兩不同,不會(huì)有平局的情況。
輸入
輸入第一行包含兩個(gè)正整數(shù)n,m,分別代表參賽選手?jǐn)?shù)量和取得連勝的要求。(1<=n<=100000,1<=m<=10^9)
輸入第二行包含n個(gè)正整數(shù),中間用空格隔開(kāi),第i個(gè)數(shù)表示隊(duì)伍的第i位選手的戰(zhàn)斗力,整體是一個(gè)1~n的排列。
輸出
輸出僅包含一個(gè)正整數(shù),表示截止到游戲終止,共進(jìn)行多少場(chǎng)比賽。
樣例輸入
4 2
1 3 2 4
樣例輸出
2
提示
樣例解釋
顯然第一局應(yīng)該是戰(zhàn)斗力為3的選手獲勝,第二局同樣是戰(zhàn)斗力為3的選手獲勝,2連勝終止游戲,所以答案是2。此時(shí)若修改m為3,則結(jié)果是5。
代碼
解題思路寫(xiě)在代碼的注釋里
#include <iostream>
#include <queue>
using namespace std;
int main(){
//n,m,分別代表參賽選手?jǐn)?shù)量和取得連勝的要求
//cnt記錄作為基準(zhǔn)選手的勝場(chǎng)數(shù)
int n, m, h, y, cnt;
//cnt2表示共進(jìn)行了多少場(chǎng)比賽
int cnt2 = 0;
//定義隊(duì)列來(lái)存儲(chǔ)每位選手的戰(zhàn)斗力
queue <int> q;
cin >> n >> m;
for(int i = 0; i < n; i++){
//將戰(zhàn)斗力存儲(chǔ)在隊(duì)列中
cin >> h;
q.push(h);
}
//取出第一個(gè)隊(duì)列當(dāng)作基準(zhǔn)
h = q.front();
q.pop();
//默認(rèn)勝場(chǎng)為零
cnt = 0;
while(cnt < m){
//一次循環(huán)代表進(jìn)行一場(chǎng)比賽
cnt2 ++;
y = q.front();
//將基準(zhǔn)h與現(xiàn)在隊(duì)首的y相比較
if(h > y){
//如果h勝了,他繼續(xù)當(dāng)基準(zhǔn),然后他的勝場(chǎng)+1
cnt++;
//將隊(duì)首的y取出,放到隊(duì)列
q.pop();
q.push(y);
}
else{
//如果y勝了,把原來(lái)的h放到隊(duì)尾,然后將y作為基準(zhǔn),他的勝場(chǎng)置為1,
q.pop();
q.push(h);
h = y;
cnt = 1;
}
}
cout << cnt2 << endl;
return 0;
}
遇到此類問(wèn)題,但看了文章還是未解決,
評(píng)論或加 QQ:781378815