社区讨论

【11NOIP普及组】瑞士轮

P1309[NOIP 2011 普及组] 瑞士轮参与者 7已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@lo8z9iuj
此快照首次捕获于
2023/10/28 02:59
2 年前
此快照最后确认于
2023/10/28 02:59
2 年前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

struct Node {
    int f; // 分数
    int s; // 实力值
    int b; // 编号
};

bool cmp(const Node &a, const Node &b)
{
    if (a.f == b.f) {
        return a.b < b.b;
    }
    return a.f > b.f;
}

void show(vector<Node> &a)
{
    for (int i = 0; i < a.size(); i++) {
        cout << a[i].f << ' ' << a[i].s << ' ' << a[i].b << endl;
    }
    cout << "----------------------------" << endl;
}

int main()
{
    // freopen("in.txt", "r", stdin);
    int n, r, q;
    cin >> n >> r >> q;
    vector<Node> a(2 * n);
    for (int i = 0; i < 2 * n; i++) {
        cin >> a[i].f;
    }
    for (int i = 0; i < 2 * n; i++) {
        cin >> a[i].s;
        a[i].b = i + 1;
    }
    sort(a.begin(), a.end(), cmp);
    // show(a);
    vector<Node> win(n), lose(n);
    for (int i = 0; i < r; i++) {
        for (int j = 0; j < n; j++) {
            if (a[2 * j].s > a[2 * j + 1].s) {
                a[2 * j].f++;
                win[j] = a[2 * j];
                lose[j] = a[2 * j + 1];
            } else {
                a[2 * j + 1].f++;
                win[j] = a[2 * j + 1];
                lose[j] = a[2 * j];
            }
        }
        // show(a);
        // sort(a.begin(), a.end(), cmp);
        int wi = 0, li = 0, k = 0;
        while(wi < n && li < n) {
            if (cmp(win[wi], lose[li])) {
                a[k++] = win[wi++];
            } else {
                a[k++] = lose[li++];
            }
        }
        while(wi < n) {
            a[k++] = win[wi++];
        }
        while(li < n) {
            a[k++] = lose[li++];
        }
        // show(a);
    }
    cout << a[q - 1].b;
    return 0;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...