【问题描述】
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<string>
#include<algorithm>
//#include<stdio.h> sscanf所在头文件
#include<sstream>
using namespace std;
struct team{
string name;
int score;
int netnum;
int num;
team():score(0),netnum(0),num(0){
}
};
bool compareIn(const team& right,const team& left){
if(right.score!=left.score)
return right.score>left.score;
else if(right.netnum!=left.netnum)
return right.netnum>left.netnum;
else if(right.num!=left.num)
return right.num>left.num;
return 0;
}
bool compareOut(const team& right,const team& left){
return right.name<left.name;
}
int main(){
int n;
cin>>n;
team t[n];
for(int i=0;i<n;i++){
cin>>t[i].name;
}
string matchVs,matchScore,name1,name2;
string numm1,numm2;
stringstream ss;
//由于我是使用substr截取的,所以截取下来的数字(进球数)其实是
//字符串的数据形式,需要借助stringstream转化为int型
int pos,num1=0,num2=0;
for(int i=0;i<n*(n-1)/2;i++){
cin>>matchVs>>matchScore;
pos=0;
while(matchVs[pos]!='-')
pos++;
name1=matchVs.substr(0,pos);
name2=matchVs.substr(pos+1,30);
pos=0;
while(matchScore[pos]!=':')
pos++;
numm1=matchScore.substr(0,pos);
numm2=matchScore.substr(pos+1,30);
ss<<numm1;
ss>>num1;
ss.clear();
ss<<numm2;
ss>>num2;
ss.clear();
//43~63是把输入的字符串转化为我们想要的数据
//sscanf(matchVs.c_str(),"%s-%s",&name1,&name2);
//sscanf(matchScore.c_str(),"%d:%d",&num1,&num2);
//这个地方不知道为什么我用sscanf会导致运行时候出现问题
for(int j=0;j<n;j++){
if(t[j].name==name1){
t[j].netnum=t[j].netnum+num1-num2;
t[j].num=t[j].num+num1;
if(num1>num2)
t[j].score=t[j].score+3;
else if(num1==num2)
t[j].score=t[j].score+1;
}
if(t[j].name==name2){
t[j].netnum=t[j].netnum+num2-num1;
t[j].num=t[j].num+num2;
if(num2>num1)
t[j].score=t[j].score+3;
else if(num2==num1)
t[j].score=t[j].score+1;
}
}
//70~87按输入的数据计算出每个队的情况
}
sort(t,t+n,compareIn);
sort(t,t+n/2,compareOut);
for(int i=0;i<n/2;i++){
cout<<t[i].name<<endl;
}
return 0;
}
欢迎大佬指正 ^ _ ^