360校招——最後贏家(C++)

⭐ 文章鏈接: www.mengyingjie.com/archives/39/ ⭐

最後贏家

時間限制: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章