题目描述
n(n≤100)n(n≤100) 名同学参加歌唱比赛,并接受 m(m≤20)m(m≤20) 名评委的评分,评分范围是 00 到 1010 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m−2m−2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 22 位小数。
输入格式
第一行两个整数 n,mn,m。
接下来 nn 行,每行各 mm 个整数,表示得分。
输出格式
输出分数最高的同学的分数,保留两位小数。
输入输出样例
输入 #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
解题思路
这道题思路也比较好想,困难的应该就是要输入n*m个数字,还要去掉每行最大最小的数,还要求平均,还要判断最终每行的平均值,会比较难想。这里可以采用两个循环嵌套分别控制行和列,在内层再进行判断最大最小值,用数组记录每一行的总和,再在外层循环去掉最大最小值。剩下的比较大小就很常规了。
for (int i = 0; i < n; i++)
{
int max = -1, min = 11;//分别赋小值和大值
for (int j = 0; j < m; j++)
{
scanf("%d", &a);
if (a > max)
max = a;
if (a < min)
min = a;
b[i] = b[i] + a;//b[i]表示每个学生的总分
}
b[i] = b[i] - max - min;
}
一些细节
1.用max,min记录最大最小值的时候,要现在第一层循环内初始化一个小的值和大的值,这样每一行会重新判断。
for (int i = 0; i < n; i++)
{
int max = -1, min = 11;//分别赋小值和大值
for (int j = 0; j < m; j++)
2.求平均分时要记得(m-2),去掉最大最小值。b[i]前加(float)更改数据类型,不然就是取商了。
for (int i = 0; i < n; i++)
{
av = (float)b[i] / (m - 2);//求平均分
if (av > smax)
smax = av;
}
代码如下
#include <stdio.h>
int main()
{
int n, m, a;
scanf("%d %d", &n, &m);
int b[100] = { 0 };//记录每个学生成绩
float av,smax=0;
for (int i = 0; i < n; i++)
{
int max = -1, min = 11;//分别赋小值和大值
for (int j = 0; j < m; j++)
{
scanf("%d", &a);
if (a > max)
max = a;
if (a < min)
min = a;
b[i] = b[i] + a;//b[i]表示每个学生的总分
}
b[i] = b[i] - max - min;
}
for (int i = 0; i < n; i++)
{
av = (float)b[i] / (m - 2);//求平均分
if (av > smax)
smax = av;
}
printf("%.2f",smax);
return 0;
}
碎碎念
我发现用c写题解的好少啊,c++之类的特别多,这种题找个c的对一下代码都找不到合适的QAQ。所用出了这个,希望对你有帮助,求点赞关注喵~
标签:smax,洛谷,min,int,题解,深基,++,av,max From: https://blog.csdn.net/2403_88098719/article/details/143261135