校园十佳歌手比赛中,评委会给参赛选手打分。选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分。共有 � n 个参赛选手,从 1 到 � n 编号,现在已知每个歌手的所有评委打分情况,请帮助给出所有选手的最后得分,并给出排名第一的选手编号。 Input 第一行输入两个正整数 � , � n,m( 3 ≤ � , � ≤ 1 0 3 3≤n,m≤10 3 ),分别表示参赛选手数量和评委数量。 之后 � n 行,每行 � m 个数,表示所有评委给这一参赛选手的打分情况(满分100)。 Output 输出有 � + 1 n+1 行。 前 � n 行每行一个数,表示每个参赛选手的最后得分(向上取整)。 最后一行输出最后得分排名第一的选手编号,若有多个选手并列第一则按字典序输出所有排名第一的选手编号。 Sample input 1Copy 5 3 80 90 95 80 80 80 88 90 90 70 80 90 80 85 90 output 1Copy 90 80 90 80 85 1 3 c++代码
时间: 2024-04-18 08:26:18 浏览: 61
你可以使用C++来解决这个问题,首先计算每个选手的最后得分,然后找出最高得分,并记录得到最高得分的选手编号。下面是C++代码实现:
```cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <map>
int main() {
int n, m;
std::cin >> n >> m;
std::vector<std::vector<int>> scores(n, std::vector<int>(m));
std::vector<int> finalScores(n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
std::cin >> scores[i][j];
}
// 去掉一个最高分和一个最低分
std::sort(scores[i].begin(), scores[i].end());
scores[i].pop_back();
scores[i].erase(scores[i].begin());
// 计算平均得分(向上取整)
finalScores[i] = ceil(std::accumulate(scores[i].begin(), scores[i].end(), 0) / static_cast<double>(m - 2));
}
// 找出最高得分
int maxScore = *std::max_element(finalScores.begin(), finalScores.end());
// 找出得到最高得分的选手编号
std::map<int, int> winners;
for (int i = 0; i < n; i++) {
if (finalScores[i] == maxScore) {
winners[i + 1]++;
}
}
// 输出最后得分
for (int i = 0; i < n; i++) {
std::cout << finalScores[i] << std::endl;
}
// 输出排名第一的选手编号
for (const auto& winner : winners) {
std::cout << winner.first << " ";
}
std::cout << std::endl;
return 0;
}
```
你可以将输入数据放在标准输入中,然后运行程序,得到输出结果。前n行输出表示每个参赛选手的最后得分(向上取整),最后一行输出表示排名第一的选手编号。如果有多个选手并列第一,则按字典序输出所有选手编号。希望对你有帮助!