根据给定的选手能举起的最大重量值,确定冠军、亚军和季军的编号问题案例代码

题目描述

n个人参加举重比赛,编号为1~n。已知每个人最多能举起的重量值,笑笑想知道如果只是第a到b个人参加比赛,且每个人都能发挥自己的最大能力,则冠军、亚军、季军分别是谁呢?

输入

第 1 行为2个整数 n、m,其中n表示人数,m表示询问的次数。

第2行n个正整数,第i个正整数表示编号为i的选手所能举起的最大重量。

接下来m行,每行3个整数 a,b,k。如果k=1,表示询问第a到b个人参加比赛冠军的编号;

如果k=2,表示询问第a到b个人参加比赛亚军的编号;

如果k=3,表示询问第a到b个人参加比赛季军的编号;

数据范围

50%数据,1<=n,m<=1000 100%数据,1<=n<=100000,1<=m<=1000,1<=k<=3,重量值均在int范围内,a+3<b,且每个人能举起的重量值均不相同。

输出

对于每个询问,输出相应的选手编号

样例输入

6 3

1 3 2 4 6 5

1 5 3

1 4 1

2 5 2

样例输出

2

4

案例代码

这个问题是要求根据给定的选手能举起的最大重量值,确定冠军、亚军和季军的编号。下面是相应的C++代码:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int n, m;
    cin >> n >> m;

    vector<int> weights(n);
    for (int i = 0; i < n; ++i) {
        cin >> weights[i];
    }

    for (int i = 0; i < m; ++i) {
        int a, b, k;
        cin >> a >> b >> k;

        // 按照能举起的重量值排序
        vector<pair<int, int>> players;
        for (int j = a - 1; j < b; ++j) {
            players.push_back({weights[j], j + 1});
        }
        sort(players.begin(), players.end(), greater<pair<int, int>>());

        // 输出对应名次的选手编号
        if (k == 1) {
            cout << players[0].second << endl; // 冠军
        } else if (k == 2) {
            cout << players[1].second << endl; // 亚军
        } else if (k == 3) {
            cout << players[2].second << endl; // 季军
        }
    }

    return 0;
}

这段代码读取了输入的人数n和询问次数m,以及每个选手的能举起的最大重量值。然后,对于每个询问,根据给定的范围选取参赛选手,并按照能举起的重量值排序。最后,根据k的值输出对应名次的选手编号。

© 版权声明
THE END
喜欢就支持一下吧
点赞14赞赏 分享