题目描述
随着小猪界象征着最高级别的小猪足球世界杯的开打,很多人都加入了猜球的行列,小香猪由于各种原因以球员的身份参赛,但是她也积极加入猜球行列。小猪足球世界杯是分成好几轮来打的,每一轮有特定场次比赛组成,每一场比赛以后,如果你不仅可以通过猜对这一场比赛的胜负而得分,而且如果猜对了比分,还可以得到额外的分数,每一轮结束以后,获得最高分的人会因此而得到特殊的分数,我们把它叫做一摩尔(等一下如果出现平局一摩尔就会派上用处啦)。如果此时有多人同时获得最高分,那么每人将得到一摩尔。
当小猪足球世界杯比赛结束以后,获得分数最高的将被封为球神的称号。
前些日子这一些事情听起来还很遥远,可是转眼明天将举行最后的决赛,但是博彩公司现在还没有开始算每个人的得分,那么请你赶快写一个程序来计算每个人的得分。
博彩公司会给你所有参加猜球者的姓名,他们对每一场球赛的预测,以及每一场球赛的结果和比分。你需要算出每一个参与者的得分和他的摩尔数,并按他们的得分排序输出。
在这个博彩公司,如果你猜对一场球的胜负平那么将得到一分,如果不仅如此,还猜中了比分,那么你将得到额外的两分。
输入
输入文件的第一行是一个正整数Case,表示一下有Case组测试数据。对于每一组测试数据的第一行,将有由空格隔开的两个正整数p(1 <= p <= 50), r(1 <= r <= 14)组成,p表示参加猜球的人数,r表示球赛一共进行r轮。接下来包含p行,其中第i行表示第i个参与者的名字,他们的名字由至多50个字符组成。接下来会有r个描述,分别给出每一轮的球赛信息。
对于每一轮,第一行由一个正整数g(1 <= g <= 16)组成,表示这一轮一共进行了g场比赛。接下来给出每一场比赛的信息。
对于每一场比赛,首先包含这场比赛的比分,接下来有p行,分别表示每一个猜球者对这场比赛比分作出的预测。所有比分都以X : Y的形式给出(分号前后以一个空格隔开),这里X,Y是非负整数。
输出
对于每一组输入数据,第一行输出 “Scenario #i:”,其中i表示当前是第i组数据,i从1开始计数。接下来的p行给出所有参与者的分数和摩尔数以及他们的名字,具体输出方式有以下要求:
1、 获得分数越多的排名越高;
2、 如果分数相同,他们的摩尔数越多排名越高;
3、 如果分数相同摩尔数也相同,那么按照输入顺序输出。
4、 对于每一行,分数、摩尔数、姓名必须以一个空格隔开。每一组输出数据以一个空行结束。
样例输入
2
2 2
Gerhard Delling
Guenter Netzer
1
4 : 3
0 : 1
1 : 0
2
1 : 0
1 : 0
1 : 0
0 : 0
2 : 1
0 : 0
3 1
Johannes B. Kerner
Urs Meier
Juergen Klopp
1
2 : 1
2 : 1
2 : 1
2 : 1
样例输出
Scenario #1:
7 2 Guenter Netzer
3 0 Gerhard DellingScenario #2:
3 1 Johannes B. Kerner
3 1 Urs Meier
3 1 Juergen Klopp
#include <iostream>
#include <string>
#include <string.h>
#include <stdio.h>
using namespace std;
struct pe {
string name;
int mol;
int score;
};
int p, r;
pe pes[50];
int score[50]; //每一轮的分数
void solve()
{
int i, j, g, m;
scanf("%d%d", &p, &r);
fill(pes, pes + p, pe{ "", 0, 0 });
cin.get();
for (i = 0; i < p; i++) {
getline(cin, pes[i].name);
}
for (i = 0; i < r; ++i) {//每一轮
memset(score, 0, sizeof score);
scanf("%d", &g);
for (j = 0; j < g; ++j) {//每一场
int a, b, qu;
scanf("%d : %d", &a, &b);
if (a > b) qu = 1;
else if (a == b) qu = 0;
else qu = -1;
for (m = 0; m < p; m++) { //每一个人
int c, d, qu1;
scanf("%d : %d", &c, &d);
if (c > d) qu1 = 1;
else if (c == d) qu1 = 0;
else qu1 = -1;
if (qu == qu1) {
score[m]++;
if (a == c && b == d)
score[m] += 2;
}
}
}
int max = 0;
for (j = 0; j < p; j++)
if (score[j] > max)
max = score[j];
for (j = 0; j < p; j++) {
pes[j].score += score[j];
if (score[j] == max)
pes[j].mol++;
}
}
pe p1;
for(i = 0; i < p; ++i)
for (j = i + 1; j < p; ++j)
if (pes[i].score > pes[j].score || pes[i].score == pes[j].score && pes[i].mol > pes[j].mol) {
p1 = pes[i];
pes[j] = pes[i];
pes[i] = p1;
}
for (i = 0; i < p; ++i) {
printf("%d %d ", pes[i].score, pes[i].mol);
cout << pes[i].name << endl;
}
}
int main()
{
int loop, i;
scanf("%d", &loop);
for (i = 0; i < loop; ++i) {
printf("Scenario #%d:\n", i + 1);
solve();
printf("\n");
}
return 0;
}