奥运会上有一些综合项目有多个子项目,如铁人三项、现代五项、十项全能等。假设这些综合项目的成绩是按照各个子项目的积分之和计算的(总积分越高,则成绩越好)。设每个子项目的积分规则为如下:第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;
}