Skip to content

洛谷 - P5738 歌唱比赛

题解468 字
检测到 KaTeX 加载失败,可能会导致文中的数学公式无法正常渲染。

#题面

#题目描述

n(n100)n(n\le 100) 名同学参加歌唱比赛,并接受 m(m20)m(m\le 20) 名评委的评分,评分范围是 0 到 10 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m2m-2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 2 位小数。

#输入格式

#输出格式

#输入输出样例

输入#1

7 6
4 7 2 6 10 7
0 5 0 10 3 10
2 6 8 4 3 6
6 3 6 7 5 8
5 9 3 3 8 1
5 9 9 3 2 0
5 8 0 4 1 10

输出#1

6.00

#思路

首先定义一个结构体,里面存放各个评委给出的分数、总分数和平均分。

然后写一个初始化函数:

C++
1
2
3
4
node() {
memset(this->score, 0x00, sizeof(this->score));
all = sum = 0.00;
}

再写一个处理函数:

C++
1
2
3
4
5
6
7
8
9
10
void t(int m) {
for (int i = 0; i < m; i++) {
cin >> score[i];
}
std::sort(score, score + m);
for (int i = 1; i + 1 < m; i++) {
sum += score[i];
}
all = sum / (m - 2.00);
}

这个处理函数分为了三部分:读入排序按题目要求计算平均分

#代码

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <bits/stdc++.h>

using namespace std;

struct node {
int score[22];
double sum, all;

node() {
memset(this->score, 0x00, sizeof(this->score));
all = sum = 0.00;
}

void t(int m) {
for (int i = 0; i < m; i++) {
cin >> score[i];
}
std::sort(score, score + m);
for (int i = 1; i + 1 < m; i++) {
sum += score[i];
}
all = sum / (m - 2.00);
}
};

bool cmp(node a, node b) {
return a.all > b.all;
}

int main() {
int n, m;
node student[105];
cin >> n >> m;
for (int i = 0; i < n; i++) {
student[i].t(m);
}
sort(student, student + n, cmp);
printf("%.2lf", student[0].all);
return 0;
}