Problem B: 合唱比赛开始了!

HomeWeb BoardProblemSetStandingStatusStatistics

Problem B: 合唱比赛开始了!

Time Limit: 1 Sec   Memory Limit: 128 MB
Submit: 1127   Solved: 631
[ Submit][ Status][ Web Board]

Description

为迎接计算机科技文化节的到来,我院面向一年级学生举办了一场合唱比赛。邀请了若干位专家担任评委,并为每个参赛队评分。现在,请设计一个程序来展示这个比赛过程。

其中,类 Team描述了参赛队的信息,包括:专业名称、每个专家给该参赛队的评分以及最终得分等。类Contest描述了竞赛的信息,包括各个参赛队的列表,并提供

1. void Input()方法:用于输入所有参赛队的信息;

2. void Compute()方法:计算每个代表带队的最终得分。

3. void Show()方法:显示所有代表队的信息。

4. void Sort()方法:根据代表队的最终得分进行排序。

要求:

1. 假设有M个代表队参加比赛,有N个评委进行评分,且评分标准包括P项。

2. 每个评委将为每个代表队打出P个分项分,每项得分都在0~100之间,一个评委为一个代表队评出的最终分数是所给出的所有分项分的平均分。如:P=3,评委1给代表队x打的3个分数为100,90,80,则x代表队得到的来自于评委1的分数为(100+90+80)/3=90。

3. 每个代表队得到的最终分数是N个评委的给出的N个分数值,去掉1个最高分,1个最低分,剩余分数的平均值。如:经过上一步的计算,x代表队得到的来自N=4个评委的得分分别是100,90,80,70,则x代表队的最终得分是(90+80)/2=85。

Input

 输入有多行。第一行分别输入M>1,N>3,P>0表示代表队数量、评委人数以及评分标准数。

之后分别输入M个代表的信息。每个代表队信息的第一行是队伍的专业名(10个字母以内),之后的N行是N个评委为该代表队打的分数,其每行有P个数,分别是该评委为该代表队打出的各个分项分。

Output

 输出有M行,根据每个代表队的得分,按照从大到小的顺序输出。其中专业名称靠左输出,占11个字符,之后输出成绩。成绩输出2位小数。假定所有队伍的得分都不相同。

Sample Input

3 4 5MajorA90 90 90 90 9082 83 81 82 8670 70 70 70 7090 90 90 90 90MajorAA85 79 90 78 8080 80 80 80 8081 81 83 82 8180 80 80 80 80MajorAaa70 70 70 70 7070 70 70 70 7070 70 70 70 7070 70 70 70 70

Sample Output

MajorA 86.40MajorAA 80.80MajorAaa 70.00

HINT

 用left来让输出左对齐。


Append Code

[ Submit][ Status][ Web Board]
#include <iostream>
#include <iomanip>
using namespace std;
class Team
{
protected:
    string majorname;
    double score[30][30];
    double  finalscore[110];
    double fs;
    int nn, pp;
public:
    Team() { }
    ~Team() { }
public:
    void setname(string name)
    {
         majorname = name;
    }
    void setsore(int n, int p)
    {
        nn = n; pp = p;
        for(int i = 0; i < n; i++)
        {
            finalscore[i] = 0;
            for(int j = 0; j < p; j++)
            {
                cin >> score[i][j];
                finalscore[i] += score[i][j];
            }
             finalscore[i] /= p;
        }
    }
    void T_Compute(int n)
    {
        double _max, _min;
        for(int i = 0; i < n; i++)
        {
            if(i == 0)
            {
                _min = finalscore[0];
                _max = finalscore[0];
                fs = finalscore[0];
            }
            else
            {
                if(_min > finalscore[i] ) _min = finalscore[i];
                if(_max < finalscore[i] ) _max = finalscore[i];
                fs += finalscore[i];
            }
        }
        fs = (fs - _max - _min) / (n - 2);
    }
    void T_show() const
    {
        cout <<setiosflags(ios::left) << setw(11) << majorname << fixed << setprecision(2) << fs << endl;
    }
    double getfs() const { return fs; }
public:
    Team &operator =(const Team & t)
    {
        majorname = t.majorname;
        fs = t.fs;
        for(int i = 0; i < pp; i++)
        {
            for(int j = 0; j < nn; j++)
                score[i][j] = t.score[i][j];
             finalscore[i] = t. finalscore[i];
        }
        return *this;
    }
};
class Contest
{
private:
    Team team[100];
    int num;
    int n, p;
public:
    Contest() { }
    ~Contest() { }
public:
    void Input()
    {
        string name;
        cin >> num >> n >> p;
        for(int i = 0; i < num; i++)
        {
            cin >> name;
            team[i].setname(name);
            team[i].setsore(n, p);
        }
    }
    void Compute()
    {
        for(int i = 0; i < num; i++)
          team[i].T_Compute(n);
    }
    void Show() const
    {
        for(int i = 0; i < num; i++)
            team[i].T_show();
    }
    void Sort()
    {
        Team temp;
        for(int i = 0; i < num; i++)
            for(int j = i + 1; j < num; j++)
                if(team[i].getfs() < team[j].getfs())
            {
                temp = team[i];
                team[i] = team[j];
                team[j] = temp;
            }
    }
};
 
int main()
{
    Contest contest;
    contest.Input();
    contest.Compute();
    contest.Sort();
    contest.Show();
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值