最後贏家
時間限制:C/C++語言 1000MS;其他語言 3000MS
內存限制:C/C++語言 65536KB;其他語言 589824KB
題目描述:
最強的不一定是最後的贏家。
某賽事有n名選手參加,但是不同於其他的比賽,本比賽採取的是擂臺賽的形式,n名選手排成一排,每次隊伍的第一位和第二位選手進行比賽,輸的一方會排到隊尾。
當某位選手取得m連勝時,他將成爲最後的贏家,且遊戲結束,請問截止到遊戲結束,共會進行多少次比賽。
兩位選手的比賽結果由他們的戰鬥力決定,n位選手的戰鬥力是一個1~n的排列,也就是說他們的戰鬥力兩兩不同,不會有平局的情況。
輸入
輸入第一行包含兩個正整數n,m,分別代表參賽選手數量和取得連勝的要求。(1<=n<=100000,1<=m<=10^9)
輸入第二行包含n個正整數,中間用空格隔開,第i個數表示隊伍的第i位選手的戰鬥力,整體是一個1~n的排列。
輸出
輸出僅包含一個正整數,表示截止到遊戲終止,共進行多少場比賽。
樣例輸入
4 2
1 3 2 4
樣例輸出
2
提示
樣例解釋
顯然第一局應該是戰鬥力爲3的選手獲勝,第二局同樣是戰鬥力爲3的選手獲勝,2連勝終止遊戲,所以答案是2。此時若修改m爲3,則結果是5。
代碼
解題思路寫在代碼的註釋裏
#include <iostream>
#include <queue>
using namespace std;
int main(){
//n,m,分別代表參賽選手數量和取得連勝的要求
//cnt記錄作爲基準選手的勝場數
int n, m, h, y, cnt;
//cnt2表示共進行了多少場比賽
int cnt2 = 0;
//定義隊列來存儲每位選手的戰鬥力
queue <int> q;
cin >> n >> m;
for(int i = 0; i < n; i++){
//將戰鬥力存儲在隊列中
cin >> h;
q.push(h);
}
//取出第一個隊列當作基準
h = q.front();
q.pop();
//默認勝場爲零
cnt = 0;
while(cnt < m){
//一次循環代表進行一場比賽
cnt2 ++;
y = q.front();
//將基準h與現在隊首的y相比較
if(h > y){
//如果h勝了,他繼續當基準,然後他的勝場+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