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;
}