白駿1966号(ByC++)


質問する


白準アルゴリズム1966号


この問題は私の理解力が足りないからか、長い時間をかけてやっと分かった.
まずテスト例を受けます.次に、各テストケースで、要素の数と知りたい要素を最初にいくつかに含め、要素を入力します.
混同されているのは、ランキングと同じかどうかです.問題をよく読んでみると、優先順位Qとは少し違うことがわかりました.重要度は同じですが、重要度が落ちると一番後ろになります.だから私はmを入力する私の好奇心のある要素の位置を調整することがこの問題の最大の鍵だと思います.この問題だけを解決すれば、残りの部分は重要度に応じて調整されるので、あまり難しくありません.

コード#コード#

#include <iostream>
#include <queue>
using namespace std;

queue<int> q;

int findOrder(int n, int m) {
    int ans = 0;
    while (!q.empty()) {
        int front = q.front();
        bool check = true;
        for (int i = 0; i < q.size(); i++) {
            q.push(q.front());
            q.pop();
            if (q.front() > front) {
                check = false;
            }
        }
        if (!check) {
            q.push(q.front());
            q.pop();
            if (m == 0)
                m = q.size() - 1;
            else
                m--;
        } else {
            q.pop();
            ans++;
            if (m == 0)
                return ans;
            else
                m--;
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    int t;
    cin >> t;
    for (int i = 0; i < t; i++) {
        int n, m;
        cin >> n >> m;
        // 큐 초기화
        while (!q.empty())
            q.pop();
        for (int i = 0; i < n; i++) {
            int k;
            cin >> k;
            q.push(k);
        }
        cout << findOrder(n, m) << '\n';
    }

    return 0;
}