训练联盟第二场训练赛 Soccer Standings

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;

		

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值