← 返回题目页

A0747 [2011J3]瑞士轮

标程

#include <bits/stdc++.h>
using namespace std;

struct Player {
    int id;       // 编号
    long long score;  // 总分
    int power;    // 实力值
};

// 排名规则:总分高的在前;总分相同,编号小的在前
bool better(const Player &a, const Player &b) {
    if (a.score != b.score) return a.score > b.score;
    return a.id < b.id;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, R, Q;
    cin >> N >> R >> Q;
    int M = 2 * N;

    vector<Player> p(M);
    for (int i = 0; i < M; i++) {
        p[i].id = i + 1;
        cin >> p[i].score;
    }
    for (int i = 0; i < M; i++) cin >> p[i].power;

    sort(p.begin(), p.end(), better);

    vector<Player> winners, losers;
    winners.reserve(N);
    losers.reserve(N);

    for (int r = 0; r < R; r++) {
        winners.clear();
        losers.clear();

        // 按排名两两配对:第 2k-1 名对第 2k 名
        for (int k = 0; k < N; k++) {
            Player &a = p[2 * k];
            Player &b = p[2 * k + 1];
            if (a.power > b.power) {
                a.score++;
                winners.push_back(a);
                losers.push_back(b);
            } else {
                b.score++;
                winners.push_back(b);
                losers.push_back(a);
            }
        }

        // 胜者序列、败者序列各自已经按 (总分降, 编号升) 有序,归并即得新排名
        merge(winners.begin(), winners.end(), losers.begin(), losers.end(), p.begin(), better);
    }

    cout << p[Q - 1].id << '\n';
    return 0;
}

动画演示