问题 D : Football Match
题目描述
如今,足球已经成为了全世界最受欢迎的运动。许多国家都有自己的足球职业联赛。FIFA计划邀请各国的俱乐部组成一个大型的国际联赛,但手动排名毕竟太麻烦了。于是他们找到了你。
排名规则如下:
1. 一队如赢得一场比赛积3分,平一场积1分,负一场积0分。
2. 首先,队伍按总积分排序。如果两个队伍积分相同,则净胜球多的队排在前面。净胜球数为总进球数减去总失球数。
3. 如果两个队伍有相同的积分以及净胜球数,那么将按他们的名字升序排列。
输入格式
输入数据第一行包含一个整数m(m<=10000),表示比赛场数。其后m行每行给出一场比赛的信息。格式如下:
队名1 得分1:得分2 队名2
其中队名不超过20个字符,得分不超过100。假定任何联赛队伍都至少参加了一场比赛。
输出
输出相应的排名表,一行一个队伍。格式如下:
Id Nm w d l Pt Gd
"Id"是队伍的编号,从1开始。"Nm" 是队名。"w", "d" 和 "l" 分别表示这个队伍的胜场数,平场数,负场数。"Pt"表示队伍积分。"Gd"表示队伍净胜球数。
样例输入
4
Liverpool 1:0 ManchesterU
ManchesterU 3:0 Leeds
Arsenal 2:2 Liverpool
Leeds 1:5 Arsenal
样例输出
1 Arsenal 1 1 0 4 4
2 Liverpool 1 1 0 4 1
3 ManchesterU 1 0 1 3 2
4 Leeds 0 0 2 0 -7
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<string> #include<map> using namespace std; const int N=10010; struct team { string name; int w,d,l,pt,gd; } t[N]; bool cmp(team a,team b) { if(a.pt==b.pt) { if(a.gd==b.gd) return a.name<b.name; return a.gd>b.gd; } return a.pt>b.pt; } int n,cnt; map<string,int> Map; int get_num(string s)//返回每个人对应结点 { if(Map.find(s)==Map.end())//没有搜索到该键值 { Map[s]=cnt; t[cnt].name=s; t[cnt].w=t[cnt].d=t[cnt].l=t[cnt].pt=t[cnt].gd=0; cnt++; } return Map[s]; } int main() { //freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin); while(~scanf("%d",&n)) { int x1,x2; cnt=0; string str1,str2; for(int i=0; i<n; i++) { char ch; cin>>str1>>x1>>ch>>x2>>str2; //scanf("%s%d:%d%s",s1,&x1,&x2,s2); int x=get_num(str1); int y=get_num(str2); t[x].gd+=(x1-x2); t[y].gd+=(x2-x1); if(x1==x2) { t[x].d++; t[x].pt++; t[y].d++; t[y].pt++; } else if(x1>x2) { t[x].w++; t[x].pt+=3; t[y].l++; } else if(x1<x2) { t[y].w++; t[y].pt+=3; t[x].l++; } } sort(t,t+cnt,cmp); for(int i=0; i<cnt; i++) { cout<<i+1<<" "<<t[i].name<<" "<<t[i].w<<" "<<t[i].d<<" "<<t[i].l<<" "<<t[i].pt<<" "<<t[i].gd<<endl; } } return 0; }