PTA L2-015 互评成绩

题目

解读

根据输入格式,首先输入了N(学生总数)、k(每份作业的评审数)、M(需要输出的学生数),然后是N行,每行给出一份作业得到的k个评审成绩。

题目要求为

  1. 每个学生的作业会被k个同学评审,得到k个成绩。
  2. 系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。(即剩下的k-2个评审成绩会被取平均,得到每个学生的最终成绩。)
  3. 需要按非递减顺序输出最高的M个最终成绩,保留小数点后3位。

解决问题:

  1. 读取输入的学生总数N,每份作业的评审数k,需要输出的学生数M。
  2. 依次读取每个学生的评审成绩,计算去掉一个最高分和一个最低分后的平均成绩。
  3. 将所有学生的最终成绩存储起来,并按非递减顺序进行排序。
  4. 输出最后得分最高的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将想法一步一步实现,这样比调试好多了。不过这道题的话,也不需要这么麻烦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值