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