题目来源
P5738 【深基7.例4】歌唱比赛 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
题目描述
n(n≤100) 名同学参加歌唱比赛,并接受 m(m≤20) 名评委的评分,评分范围是 0 到 10 分。这名同学的得分就是这些评委给分中去掉一个最高分,去掉一个最低分,剩下 m−2 个评分的平均数。请问得分最高的同学分数是多少?评分保留 2 位小数。
输入格式
第一行两个整数 n,m。
接下来 n 行,每行各 m 个整数,表示得分。
输出格式
输出分数最高的同学的分数,保留两位小数。
分析&思路
这道题似曾相识啊,怎么跟某打分一模一样啊。其实也是有一些不一样的,比如这道题是让你输入很多组数据等等。(不好意思我实在编不下去了)
所以,我们的思路就是顺着打分那道题继续扩充。
我先定义了n,m,maxx,minn,ans这几个变量,n和m分别是同学数和评委数。maxx和minn代表的意思和打分那道题一致。
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;//由于结果可能是小数,所以用float来定义
return 0;
}
然后,输入。
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;//由于结果可能是小数,所以用float来定义
cin>>n>>m;//输入m和n
return 0;
}
如果你比较细心,可以发现:n行m列可以定义成一个二维数组。并且n,m的最大范围也给了,直接就可以定义了。我定义的数组叫做x[][]。同打分一样,我们还是要定义一个存储答案的变量。我定义的变量叫sum(ans是用来判断最大值的最终变量,并非过程的答案)。由于有很多项,所以我定义的是一维数组。
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;//由于结果可能是小数,所以用float来定义
cin>>n>>m;//输入m和n
float x[20][100]={};//定义一个n行m列的数组(20为m的最大值,100为n的最大值)
float sum[100]={};//定义一个存储答案的数组,由于最多为n的最大值(100)个选手,所以定义的长度为100
return 0;
}
接着,写一个双重循环来输入二维数组。
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;//由于结果可能是小数,所以用float来定义
cin>>n>>m;//输入m和n
float x[20][100]={};//定义一个n行m列的数组(20为m的最大值,100为n的最大值)
float sum[100]={};//定义一个存储答案的数组,由于最多为n的最大值(100)个选手,所以定义的长度为100
for(int i=0;i<n;i++)//外层循环,输入列
{
for(int j=0;j<m;j++)//内层循环,输入行
{
cin>>x[j][i];//输入输入第j行第i个打分情况
}
}
return 0;
}
同打分一样,还是来存储最大值和最小值,并且把变量相加。
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;//由于结果可能是小数,所以用float来定义
cin>>n>>m;//输入m和n
float x[20][100]={};//定义一个n行m列的数组(20为m的最大值,100为n的最大值)
float sum[100]={};//定义一个存储答案的数组,由于最多为n的最大值(100)个选手,所以定义的长度为100
for(int i=0;i<n;i++)//外层循环,输入列
{
for(int j=0;j<m;j++)//内层循环,输入行
{
cin>>x[j][i];//输入输入第j行第i个打分情况
maxx=max(maxx,x[j][i]);//最大值为自己和x[j][i]中的最大值。如果输入的数x[j][i]比自己大,它的值就会等于x[j][i]
minn=min(minn,x[j][i]);//最小值为自己和x[j][i]中的最小值。如果输入的数x[j][i]比自己小,它的值就会等于x[j][i]
sum[i]+=x[j][i];//把所有数加到一起
}
}
return 0;
}
由于要执行多次,所以在外层循环先算平均值,并存储到第i位,然后归零。
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;//由于结果可能是小数,所以用float来定义
cin>>n>>m;//输入m和n
float x[20][100]={};//定义一个n行m列的数组(20为m的最大值,100为n的最大值)
float sum[100]={};//定义一个存储答案的数组,由于最多为n的最大值(100)个选手,所以定义的长度为100
for(int i=0;i<n;i++)//外层循环,输入列
{
for(int j=0;j<m;j++)//内层循环,输入行
{
cin>>x[j][i];//输入输入第j行第i个打分情况
maxx=max(maxx,x[j][i]);//最大值为自己和x[j][i]中的最大值。如果输入的数x[j][i]比自己大,它的值就会等于x[j][i]
minn=min(minn,x[j][i]);//最小值为自己和x[j][i]中的最小值。如果输入的数x[j][i]比自己小,它的值就会等于x[j][i]
sum[i]+=x[j][i];//把所有数加到一起
}
sum[i]=sum[i]-maxx-minn;//去除最大最小值
sum[i]=sum[i]/(m-2);//求平均
maxx=0;//归零
minn=2e9;//归零
}
return 0;
}
最后,再写一个循环来判断最大值,并输出即可。
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;//由于结果可能是小数,所以用float来定义
cin>>n>>m;//输入m和n
float x[20][100]={};//定义一个n行m列的数组(20为m的最大值,100为n的最大值)
float sum[100]={};//定义一个存储答案的数组,由于最多为n的最大值(100)个选手,所以定义的长度为100
for(int i=0;i<n;i++)//外层循环,输入列
{
for(int j=0;j<m;j++)//内层循环,输入行
{
cin>>x[j][i];//输入输入第j行第i个打分情况
maxx=max(maxx,x[j][i]);//最大值为自己和x[j][i]中的最大值。如果输入的数x[j][i]比自己大,它的值就会等于x[j][i]
minn=min(minn,x[j][i]);//最小值为自己和x[j][i]中的最小值。如果输入的数x[j][i]比自己小,它的值就会等于x[j][i]
sum[i]+=x[j][i];//把所有数加到一起
}
sum[i]=sum[i]-maxx-minn;//去除最大最小值
sum[i]=sum[i]/(m-2);//求平均
maxx=0;//归零
minn=2e9;//归零
}
for(int i=0;i<n;i++)//循环n次,来判断这n个结果
{
ans=max(ans,sum[i]);//ans的最大值为自己和sum[i]中的最大值。如果输入的数sum[i]比自己大,它的值就会等于sum[i]
}
printf("%.2lf",(float)ans);//输出最大结果,并保留两位小数
return 0;
}
AC代码
#include <bits/stdc++.h>
using namespace std;
int main() {
float n,m,maxx=0,minn=2e9,ans=0;
cin>>n>>m;
float x[20][100]={};
float sum[100]={};
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>x[j][i];
maxx=max(maxx,x[j][i]);
minn=min(minn,x[j][i]);
sum[i]+=x[j][i];
}
sum[i]=sum[i]-maxx-minn;
sum[i]=sum[i]/(m-2);
maxx=0;
minn=2e9;
}
for(int i=0;i<n;i++)
{
ans=max(ans,sum[i]);
}
printf("%.2lf",(float)ans);
return 0;
}
结果
打分Plus困难版