题目描述
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