【洛谷】【官方题单——函数与结构体】P5738 歌唱比赛

一、题目

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

输入

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

输出

6.00

二、自己的解法

当初自己是想着利用一个二维数组去存取数据的,然后自己再编写一个比较最大最小值函数和求平均值函数,虽然最后通过了,但是太臃肿和复杂

#include 
#include 
#include
using namespace std;

//输出浮点问题 
double Calculator(int a[][20], int i, int j);
int main()
{
	int a[100][20];
	int x, y;
	int i, j;
	double b = 0.00;
	double max_1=-1.0;
	//double flag;
	cin >> x >> y;
	for (i = 0; i < x; i++)
	{
		for (j = 0; j < y; j++)
		{
			cin >> a[i][j];
		}
		if (j == y)
		{
			b = Calculator(a, i, j);
			if (b > max_1)
			{
				max_1 = b;
			}
		}
	}

	printf("%.2f", max_1);
	return 0;
}

double Calculator(int a[][20], int i, int j)
{
	int max = -1;
	int min = 11;
	double sum = 0.0;
	double even;
	int flag_max_j=-1;
	int flag_min_j=-1;
	for (int count = 0; count < j; count++)
	{
		if (a[i][count] > max)
		{
			max = a[i][count];
			flag_max_j = count;
		}
		if (a[i][count] < min)
		{
			min = a[i][count];
			flag_min_j = count;
		}
	}
	a[i][flag_max_j] = 0;
	a[i][flag_min_j] = 0;
	for (int count = 0; count < j; count++)
	{
		sum = sum + a[i][count];
	}
	even = sum / (j - 2);
	return even;
}

三、官方优秀题解

思路:
每位同学的数据用几个临时变量存储即可

具体思路如下:
用minn存储当前评委给出的最低分,maxx 则是最高分,ans 存储1∼j 位评委给第i个同学打的总分。第二重循环结束后,减去最高分和最低分,计算这个同学的平均分,然后存在一个变量里,和上一个同学的平均分对比,大的留下即可。
注意,循环的最后需要初始化。

#include
using namespace std;
int a[10001],n,m;
double q,ans,x,minn=1e9,maxx;
int main() {
    cin>>n>>m;
    for(int i=1; i<=n; ++i) {
        for(int j=1; j<=m; ++j)
         {
         cin>>x,ans+=x,minn=min(x,minn),maxx=max(maxx,x);//计算当前最高分、最低分、总分
        ans=ans-minn-maxx;//减去最高分和最低分
        ans=1.0*ans/(1.0*(m-2));//计算平均分
        if(ans>q) q=ans;//取最大值
        ans=0;
        minn=1e9;//两个变量的初始化
    }
    printf("%0.2f\n",q);
    return 0;
}

四、心得与知识点

①要多学会运用C++中的官方库,比如求最大最小值,还有排序的库sort()都不用自己写,直接调用官方库即可,所以要学会怎么用这几个函数:max(),min(),sort()

②引入头文件#include,这个为将C++的全部库引入

③当题目中有输出精度的问题时,输出直接用printf("%.2f",a);不要用cout<

④利用for循环的时候,循环变量可以直接再语句内定义,比如for(int j=0;j

⑤函数声明时,在main函数外声明,和在main函数体内区别:
//声明在函数外,声明后面的函数(无论main还是其他函数)都可以调用
//声明在函数内部,只能在本函数内,声明后面的区域可以调用

⑥每次刷完题后,要去看别人优秀的题解,然后把别人优秀的算法记录下来,至少要看3个

你可能感兴趣的:(c++)