一、题目
# 【深基7.例4】歌唱比赛
## 题目描述
$n(n\le 100)$ 名同学参加歌唱比赛,并接受 $m(m\le 20)$ 名评委的评分,评分范围是 $0$ 到 $10$ 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 $m-2$ 个评分的平均数。请问得分最高的同学分数是多少?评分保留 $2$ 位小数。
## 输入格式
第一行两个整数 $n,m$。
接下来 $n$ 行,每行各 $m$ 个整数,表示得分。
## 输出格式
输出分数最高的同学的分数,保留两位小数。
## 样例 #1
### 样例输入 #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
```
二、代码
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[100][20];
int n, m;
while (cin >> n >> m)
{
for (int i = 0;i < n;i++)
for (int j = 0;j < m;j++)
cin >> a[i][j];
double t, Max = 0;
//遍历每一行,假设现在是第1行
for (int i = 0;i < n;i++)
{
//先设置第一行的最小和最大初值,依据是打分范围在(0,10)
int max = 0, min = 10, s = 0;
//遍历该行的所有元素,找出最高分和最低分
for (int j = 0;j < m;j++)
{
if (max < a[i][j])
max = a[i][j];
if (min > a[i][j])
min = a[i][j];
s += a[i][j];
}
t = double(s - max - min) / (m - 2);
//cout << t << endl;计算并输出检查每行的有效平均分是否正确
if (Max < t)
Max = t;
}
cout <<fixed<<setprecision(2)<<Max << endl;
}
return 0;
}
三、总结
一些心得:
本题虽然可以用排序法找出最高分和最低分(简单粗暴) ,但是没必要(比较耗时)。不如直接遍历找出max和min(变换赋值法)。
(个人刷题录,欢迎交流,共同学习进步)