问题描述
2018年俄罗斯世界杯结束了,法国获得冠军,全世界球迷度过了一个非常愉快的夏天。作为中国球迷,不能总是看别人踢球,这不福利来了,根据FIFA(国际足联)及全体成员协会的一致决定,2118年世界杯将在中国举办,作为东道主,中国队将无需参加预选赛而直接参加决赛阶段的比赛。
比赛规则如下:
-
总共n(n为偶数)个球队参加比赛
-
按照分组赛积分排名,前n/2的球队进入淘汰赛
-
积分排名的规则如下:球队获胜得3分,平局得1分,失利得0分,按照积分递减、净胜球递减以及进球数递减方式排名
编写一个程序,根据给出的参赛队伍名单和所有比赛的结果,找出成功进入淘汰赛阶段的球队名单。
输入形式
第一行输入包含唯一整数n(1<=n<=50),参加世界杯决赛的球队数量。接下来的n行是各球队的名字,为长度不超过30个字符的英文字符。接下来的n*(n-1)/2行,每行格式name1-name2 num1:num2(0<=num1, num2<=100),表示对阵球队及比分.
输出形式
输入n/2行,表示进入淘汰赛阶段的球队,按照字典序进行排列,每个球队名字占一行。
样例输入
4
A
B
C
D
A-B 1:1
A-C 2:2
A-D 1:0
B-C 1:0
B-D 0:3
C-D 0:3
样例输出
A
D
参考代码
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
struct team{ //队伍结构体
string name; //队名
int score; //积分
int jin; //净胜球
int goal; //进球数
};
int Find(string s,team *t,int n){
for(int i=0;i<n;i++){
if(s==t[i].name)return i;
}
return -1;
}
bool cmp(team a,team b){ //两支队伍进行比较的方法
if(a.score!=b.score)return a.score>b.score; //比积分
else if(a.jin!=b.jin)return a.jin>b.jin; //积分相同比净胜球
else return a.goal>b.goal; //净胜球相同比进球
}
int main(){
int n;
cin>>n;
cin.get();
team t[n];
for(int i=0;i<n;i++){
cin>>t[i].name;
t[i].goal=0;
t[i].jin=0;
t[i].score=0;
}
for(int i=0;i<n*(n-1)/2;i++){ //模拟比赛过程
string str,t1,t2;
char bi;
int s1,s2;
cin>>str;
cin>>s1>>bi>>s2;
int k=0;
for(int i=0;i<30;i++)
if(str[i]=='-'){
k=i;
break;
}
int len=str.length();
t1=str.substr(0,k);
t2=str.substr(k+1,len-1);
int x,y;
if(s1==s2)x=y=1;
else if(s1>s2){x=3;y=0;}
else {x=0;y=3;}
int k1=Find(t1,t,n);
t[k1].score+=x;
t[k1].goal+=s1;
t[k1].jin+=s1-s2;
int k2=Find(t2,t,n);
t[k2].score+=y;
t[k2].goal+=s2;
t[k2].jin+=s2-s1;
}
sort(t,t+n,cmp); //给所有队伍排序
string teams[n/2];
for(int i=0;i<n/2;i++)teams[i]=t[i].name; //找出晋级球队
sort(teams,teams+n/2); //球队名按字典序排序
for(int i=0;i<n/2;i++)
cout<<teams[i]<<endl;
}