2 条题解

  • 0
    @ 2025-12-13 10:43:02
    #include <iostream>
    #include <algorithm>
    #include <vector>
    using namespace std;
     
    struct Player {
        int id;
        int score;
        int strength;
    };
     
    // 比较函数:按分数降序,分数相同按编号升序
    bool cmp(const Player &a, const Player &b) {
        if (a.score  != b.score)  {
            return a.score  > b.score; 
        }
        return a.id  < b.id; 
    }
     
    int main() {
        int N, R, Q;
        cin >> N >> R >> Q;
        
        int total = 2 * N;
        vector<Player> players(total);
        
        // 读入初始分数
        for (int i = 0; i < total; i++) {
            players[i].id = i + 1;
            cin >> players[i].score;
        }
        
        // 读入实力值
        for (int i = 0; i < total; i++) {
            cin >> players[i].strength;
        }
        
        // 初始排序
        sort(players.begin(),  players.end(),  cmp);
        
        // 进行R轮比赛
        for (int round = 0; round < R; round++) {
            vector<Player> winners, losers;
            
            // 每两人一组进行比赛
            for (int i = 0; i < total; i += 2) {
                Player &p1 = players[i];
                Player &p2 = players[i + 1];
                
                if (p1.strength  > p2.strength)  {
                    p1.score++; 
                    winners.push_back(p1); 
                    losers.push_back(p2); 
                } else {
                    p2.score++; 
                    winners.push_back(p2); 
                    losers.push_back(p1); 
                }
            }
            
            // 合并胜者组和败者组
            vector<Player> new_players;
            int i = 0, j = 0;
            while (i < winners.size()  && j < losers.size())  {
                if (cmp(winners[i], losers[j])) {
                    new_players.push_back(winners[i]); 
                    i++;
                } else {
                    new_players.push_back(losers[j]); 
                    j++;
                }
            }
            
            // 处理剩余元素
            while (i < winners.size())  {
                new_players.push_back(winners[i]); 
                i++;
            }
            while (j < losers.size())  {
                new_players.push_back(losers[j]); 
                j++;
            }
            
            players = new_players;
        }
        
        // 输出第Q名的选手编号 
        cout << players[Q - 1].id << endl;
        
        return 0;
    }
    

    信息

    ID
    716
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    27
    已通过
    5
    上传者