一、题目
二、解题思路
- 去掉一个最高分和一个最低分:在输入的时候找出每个同学的最大值和最小值,index1[n],index2[n] 两个数组分别记录每个同学的最大值和最小值对应的下标。
- 注意可能会有多个最大值或有多个最小值,也可能最大值和最小值相同,为确保去掉两个数,当找最大值时,若 a[i][j]>max ,则更新,当找最小值时,若 a[i][j]<=min ,则更新。
三、代码
#include<iostream>
using namespace std;
int main()
{
int n,k,m;
cin>>n>>k>>m;
int a[n][k],index1[n],index2[n],grade[n];
for(int i=0;i<n;i++)
{
grade[i]=0;
int max=-1,min=105;
for(int j=0;j<k;j++)
{
cin>>a[i][j];
if(a[i][j]>max)
{
max=a[i][j];
index1[i]=j;
}
if(a[i][j]<=min)
{
min=a[i][j];
index2[i]=j;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<k;j++)
{
if(j!=index1[i] && j!=index2[i])
{
grade[i]+=a[i][j];
}
}
}
for(int i=0;i<n-1;i++)
{
for(int j=0;j<n-i-1;j++)
{
if(grade[j]<grade[j+1])
{
int t=grade[j+1];
grade[j+1]=grade[j];
grade[j]=t;
}
}
}
for(int i=m-1;i>=0;i--)
{
printf("%.3f",1.0*grade[i]/(k-2));
if(i)
{
cout<<" ";
}
}
return 0;
}
四、总结
在此题中,二维数组为 n 行 k 列,不要习惯性的写成 n 行 m 列。