【高阶应用】第2关:奥运会综合项目计分程序

奥运会上有一些综合项目有多个子项目,如铁人三项、现代五项、十项全能等。假设这些综合项目的成绩是按照各个子项目的积分之和计算的(总积分越高,则成绩越好)。设每个子项目的积分规则为如下:第1名积10分,第2名积7分,第3、4、5、6、7名分别5、4、3、2、1分,其它名次没有积分。

简化起见,子项目排名没有并列名次情况。一个综合项目会有多运动员参加。

要求:编写一个综合项目计分程序,先由用户输入综合项目的子项目个数,以及参赛运动员数目,然后依次输入每个运动员的姓名和各个子项目的成绩,再计算各个运动员的积分和排名,最后按照排名高低输出参赛运动员的信息,包括:排名、姓名、总积分。同样简化起见,最终排名也没有并列名次情况。

约定:运动员姓名中无空格,运动员子项目的成绩为浮点数,并且按径赛规则计算排名,即成绩越小(越快),名次越高。输出时,一个运动员信息占一行,名次、姓名、总积分之间用一个空格字符隔开。

例如输入样例为:
3 4
Alex 10.1 21.5 15.7
Bolt 12.3 11.4 25.9
Jack 8.09 12.8 20.5
Will 11.5 17.6 24.3

对上面样例的解释:
第1行的3 4表示,该综合项目有3个子项目,有4个运动员参数;
第2行Alex:第1个项目第2名(7分),第2个项目第4名(4分),第3个项目第1名(10分),总分21;
第3行Bolt:第1个项目第4名(4分),第2个项目第1名(10分),第3个项目第4名(4分),总分18;
第4行Jack:第1个项目第1名(10分),第2个项目第2名(7分),第3个项目第2名(7分),总分24;
第5行Will:第1个项目第3名(5分),第2个项目第3名(5分),第3个项目第3名(5分),总分15。
所以,最终排名:Jack第1(24分)、Alex第2(21分)、Bolt第3(18分)、Will第4(15分)。

注意:子项目的成绩越小,排名越高。温馨提示:这道题不一定需要排序。
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int score[100] = { 10,7,5,4,3,2,1 };

struct player_t
{
    string name;
    int score = 0;
    double points[100];
};
struct player_t players[100];

void contribute(int nplayer,int type)
{
    sort(players, players+ nplayer, [=](const auto &a, const auto &b)
        {return a.points[type] < b.points[type]; });


    for (int i = 0; i < nplayer; i++)
    {
        int rank = i;

        players[i].score += score[rank];
    }
}
int main()
{
    int ntype, nplayer; cin >> ntype >> nplayer;

    for (int i = 0; i < nplayer; i++)
    {
        cin >> players[i].name;

        for (int j = 0; j < ntype; j++)
        {
            cin >> players[i].points[j];
        }
    }


    for (int i = 0; i < ntype; i++)
    {
        contribute(nplayer, i);
    }


    sort(players, players + nplayer, [](const auto& a, const auto& b) {return a.score > b.score; });

        for (int i = 0; i < nplayer; i++)
        cout << i + 1 << ' ' << players[i].name << ' ' << players[i].score << endl;


    return 0;
}
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值