题目
解读
根据输入格式,首先输入了N(学生总数)、k(每份作业的评审数)、M(需要输出的学生数),然后是N行,每行给出一份作业得到的k个评审成绩。
题目要求为
- 每个学生的作业会被k个同学评审,得到k个成绩。
- 系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。(即剩下的k-2个评审成绩会被取平均,得到每个学生的最终成绩。)
- 需要按非递减顺序输出最高的M个最终成绩,保留小数点后3位。
解决问题:
- 读取输入的学生总数N,每份作业的评审数k,需要输出的学生数M。
- 依次读取每个学生的评审成绩,计算去掉一个最高分和一个最低分后的平均成绩。
- 将所有学生的最终成绩存储起来,并按非递减顺序进行排序。
- 输出最后得分最高的M个成绩,保留小数点后3位。
代码
#include<bits/stdc++.h>
using namespace std;
void sortScores(vector<int>&scores)//对分数进行排序
{
sort(scores.begin(), scores.end());
}
vector<double>getTopM(const vector<double>& scores,int M)//获取前M个最高的平均分
{
vector<double> sortedScores=scores;// 复制一份原始数组用于排序
sort(sortedScores.begin(),sortedScores.end(),greater<double>());// 排序(降序)
vector<double>topM(sortedScores.begin(),sortedScores.begin()+M);// 取得前M项
return topM;
}
int main()
{
int N,k,M,num;
cin >> N >> k >> M;// 读取学生数量N,每个学生的评分数量k,以及需要输出的前M个平均分
vector<double>aver;// 存储每个学生计算后的平均分
for(int i=0;i<N;i++)
{
vector<int>scores;// 存储单个学生的所有评分
for(int j=0;j<k;j++)
{
cin >> num;//读取评分
scores.push_back(num);
}
sortScores(scores);//对评分进行排序
scores.erase(scores.begin());// 移除最低分
scores.pop_back();// 移除最高分
int sum = accumulate(scores.begin(), scores.end(), 0);// 计算剩余评分的总和
double average = static_cast<double>(sum) / scores.size(); // 计算平均分
aver.push_back(average);// 将该学生的平均分加入结果向量
}
vector<double>topM=getTopM(aver,M);// 获取前M个最高的平均分
sort(topM.begin(),topM.end());// 对前M个平均分进行升序排序
for (int i=0;i<topM.size();i++)// 输出结果,保留三位小数
{
cout << fixed << setprecision(3) << topM[i];
if(i<topM.size()-1)
cout << " ";
}
cout << endl;
return 0;
}
总结
这道题我主要是想到哪就写哪了(故可能有些繁琐,但是易于理解),题目要你干什么,你就按照他的想法一步一步写出来,即可实现。写代码的过程中,可在代码中间添加一些cout用于输出中间过程,(可检查中间过程有无出错)然后根据这些cout将想法一步一步实现,这样比调试好多了。不过这道题的话,也不需要这么麻烦。