hdu-1225-Football Score

hdu-1225-Football Score

题目传送门:hdu1225
题意:给你很多组两个队伍的比赛信息包括队伍名,得分,进球数,净进球数,进球多的一方可以得3分,进球相同各得一分。最后要按排名输出队伍名以及它的得分,排名规则为:
1.得分
2.净进球数
3.进球数
4.队伍名
思路:一个队伍可以有多场比赛,也就是说一个队伍可以在输入中出现多次,如果直接使用结构体储存的话重名问题难以解决,而map键不重复的特性使得他成为一个不错的选择,所以我们可以先用map储存每个队伍的各项数据,之后再赋值给结构体数组,然后结构体数组排序,最后输出即可。这里我们使用三个map分别储存得分,进球数,净进球数。代码如下,慢慢体会。

#include <iostream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <map>
#include <string.h>
#include <string>
#include <memory.h>
using namespace std;
struct game
{
	string a;//队伍名
	int sco;//得分
	int net;//净进球数
	int kick;//进球
};
game g[100010];
int cmp(game m, game n)
{
	if (m.sco != n.sco)//第一看得分
		return m.sco > n.sco;
	if (m.net != n.net)//第二看净进球数
		return m.net > n.net;
	if (m.kick != n.kick)//第三看进球数
		return m.kick > n.kick;
	return m.a < n.a;//最后看队伍名
}
int main()
{
	std::ios::sync_with_stdio(false);
	int n;
	while (cin >> n)
	{
		//初始化
		for (int i = 0; i < n; i++)
		{
			g[i].a.clear();
			g[i].kick = g[i].net = g[i].sco = 0;
		}

		string p, q, vs;
		int ps, qs;
		char o;
		map<string, int>teams;//得分
		map<string, int>teamp;//进球数
		map<string, int>teamj;//净进球数
		int m = n * (n - 1);
		for (int i = 0; i < m; i++)
		{
			cin >> p >> vs >> q >> ps >> o >> qs;
			teamj[p] += ps;
			teamj[q] += qs;
			teamp[p] += ps - qs;
			teamp[q] += qs - ps;
			if (ps > qs)
			{
				teams[p] += 3;
			}
			else if (qs > ps)
			{
				teams[q] += 3;
			}
			else
			{
				teams[p]++;
				teams[q]++;
			}
		}
		map<string, int>::iterator it1, it2, it3;
		int j = 0;
		//将队伍名,得分,进球数,净进球数存入结构体数组中
		for (it1 = teams.begin(), it2 = teamp.begin(), it3 = teamj.begin(); it1 != teams.end(), it2 != teamp.end(), it3 != teamj.end(); it1++, it2++, it3++)
		{
			g[j].a = it1->first;
			g[j].sco = it1->second;
			g[j].net = it2->second;
			g[j].kick = it3->second;
			j++;
		}
		//按照Cmp中的排序规则排序
		sort(g, g + n, cmp);
		//输出结果
		for (int i = 0; i < n; i++)
		{
			cout << g[i].a << " " << g[i].sco << "\n";
		}
		cout << endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值