【洛谷】P5738 【深基7.例4】歌唱比赛

题目来源

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困难版

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值