Soccer Standings
题目(中文):
足球热再次席卷全球,来自数十个国家的数百万人
为了参加世界杯,他们会粘在电视机上。作为一个有进取心的人,你已经建立了自己的互联网世界杯足球频道,在线直播比赛。最近你想出了一个主意,让几个“专家”对比赛进行批判性分析,以此来填补比赛间隙的时间。为此,您为足球队设计了一个独特的排名系统,现在必须实现它。
问题是:
给定一个团队列表和一个比赛分数列表,您必须为每个团队计算几个数量。这些是:他们所有比赛的总进球数,对他们的总进球数(简称允许进球数),胜、平、负的次数,以及到目前为止的得分。积分的计算方法如下:赢一场比赛一队得3分,输一场则一无所获。如果平局,两队都得1分。
除此之外,您还必须根据新系统正确地对团队进行排序。队伍是按分数从高到低排列的。在积分平分的情况下,进球差距较大的球队会排在第一位。球差的定义是球队的总进球数减去对手的总进球数。
如果仍然有一个平局(即两个或更多的球队有相同的分数和相同的目标差异),总进球数较高的球队将排在第一位。如果这两个队都打成平手,名字按字母顺序排在第一位的队伍就排在第一位。
输入:
第一个输入行包含一个正整数n,表示要处理的数据集的数量。每个数据集的第一行由两个正整数T(T≤30)和G(G≤30)组成
400)–此组中的团队数量以及他们玩的游戏总数。下一行包含由单个空格分隔的T个唯一名称。每个名称都是一个不超过15个字符的大写单词。
下一个G输入行将包含匹配的结果。每行的形式
<country\u 1><score\u 1><country\u 2><score\u 2>。例如,“希腊2尼日利亚1”表示希腊和尼日利亚打了一场比分为2比1的比赛。所有四项将用单个空格分隔。
输出:
在每个数据集的输出开始时,输出“g组:”其中g是数据集编号,从1开始。接下来,您应该为每个团队打印一行,按照上面提到的顺序排列团队。对于每个团队,您打印的行的格式应为“”。这些项目应该用单个空格隔开。在每个数据集的输出后留下一个空行。
输入样例
2
2 1
KASNIA LATVERIA
KASNIA 0 LATVERIA 1
4 6
ENGLAND USA ALGERIA SLOVENIA
ENGLAND 1 USA 1
ALGERIA 0 SLOVENIA 1
SLOVENIA 2 USA 2
ENGLAND 0 ALGERIA 0
SLOVENIA 0 ENGLAND 1
USA 1 ALGERIA 0
输出样例
Group 1:
LATVERIA 3 1 0 0 1 0
KASNIA 0 0 1 0 0 1
Group 2:
USA 5 1 0 2 4 3
ENGLAND 5 1 0 2 2 1
SLOVENIA 4 1 1 1 3 3
ALGERIA 1 0 2 1 0 2
思路:
(1)首先我们可以创建一个结构体类型,存储每个球队的各种信息;
(2)其次由于题目中的球队数量较少,我们可以采用暴力查找,找到输入的球队;
(3)然后分别对各类信息分别叠加,例如样例一种KASNIA对LATVERIA进行了一场比赛,则KASNIA的总分为3、赢场为0、输场为1、平局为0、进球数为1,对方进球数为0;同理也可以对LATVERIA得到相关信息。
ac代码:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct sss//存储球队各种信息
{
string name;
int a ;
int b ;
int c ;
int d ;
int e;
int f;
};
bool cmp(sss str1, sss str2)//利用sort函数及题目中相关要求排序
{
if (str1.a == str2.a) {
if ((str1.e - str1.f) == (str2.e - str2.f)) {
if (str1.e == str2.e)
return str1.name < str2.name;
else
return str1.e > str2.e;
}
else
return ((str1.e - str1.f) > (str2.e - str2.f));
}
else
return str1.a > str2.a;
}
int main()
{
int t;
cin >> t;
int q = 1;//group数
while (t--)
{
int n, m;
cin >> n >> m;
sss str[31];
string s;
for (int i = 1; i <= n; i++)
{
cin >> s;
str[i].name = s;
str[i].a = str[i].b = str[i].c = str[i].d = str[i].e = str[i].f = 0;//初始化
}
string str2, str3;
int score1, score2;
for (int k = 1; k <= m; k++)
{
cin >> str2 >> score1 >> str3 >> score2;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)//暴力查找
{
if (str[i].name == str2 && str[j].name == str3)
{
str[i].e += score1;
str[j].e += score2;
str[i].f += score2;
str[j].f += score1;
if (score1 == score2)//分数相同平局
{
str[i].a += 1;
str[j].a += 1;
str[i].d += 1;
str[j].d += 1;
}
else if (score1 > score2)//分数不同str1.name赢、str2.name输
{
str[i].a += 3;
str[i].b += 1;
str[j].c += 1;
}
else if (score1 < score2)//分数不同str1.name输、str2.name赢
{
str[j].a += 3;
str[j].b += 1;
str[i].c += 1;
}
}
}
}
}
printf("Group %d:\n", q++);
sort(str + 1, str + 1 + n, cmp);
for (int i = 1; i <= n; i++)
{
cout << str[i].name << " " << str[i].a << " " << str[i].b << " " << str[i].c << " " << str[i].d << " " << str[i].e << " " << str[i].f << endl;
}//换行输出即可
cout << endl;
}
}