题目:
【问题描述】
2018年俄罗斯世界杯结束了,法国获得冠军,全世界球迷度过了一个非常愉快的夏天。作为中国球迷,不能总是看别人踢球,这不福利来了,根据FIFA(国际足联)及全体成员协会的一致决定,2118年世界杯将在中国举办,作为东道主,中国队将无需参加预选赛而直接参加决赛阶段的比赛。
规则:
按照分组赛积分排名,前n/2的球队进入淘汰赛
球队获胜得3分,平局得1分,失利得0分
按照积分递减、净胜球递减以及进球数递减方式排名
【输入形式】
第一行输入包含唯一整数n(1<=n<=50),球队数量。
接下来的n行是各球队的名字
接下来的n*(n-1)/2行,
每行格式name1-name2 num1:num2//恶心点
(0<=num1, num2<=100),表示对阵球队及比分.
【输出形式】
输入n/2行,表示进入淘汰赛阶段的球队
按照字典序进行排列,每个球队名字占一行。
字符串相关函数参考:
https://blog.csdn.net/qq_43309286/article/details/93191767
用于处理题目里恶心的麻烦输入,空格不好吗非要来个 ‘-’ ‘ :’
stringstream相关函数参考
https://www.cnblogs.com/feifanrensheng/articles/9086722.html
- find
- substr
- stringstream:读取字符串里的int;
ignore函数
字典序排序
直接用<
代码
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
struct team
{
string name;
int score=0;
int clearBall=0;
int ball=0;
};
int findS(string s,team* t,int n)
{
for(int i=0;i<n;i++)
if(s==t[i].name) return i;
}
bool cmp(team x,team y)
{
if(x.score != y.score) return x.score > y.score;
if(x.clearBall != y.clearBall) return x.clearBall > y.clearBall;
else return x.ball>y.ball;
}
bool cmp2(team x,team y)
{
return x.name<y.name;
}
int main()
{
int n;cin>>n;
team t[n];
for(int i=0;i<n;i++)
cin>>t[i].name;
string str1,str2,s1,s2;
int index,x,y,i1,i2,a,b;
for(int i=0;i<n*(n-1)/2;i++)
{
cin>>str1>>str2;
index=str1.find("-");
s2=str1.substr(index+1);
s1=str1.substr(0,index);
i1=findS(s1,t,n);i2=findS(s2,t,n);
stringstream in(str2);
in>>a;
in.ignore(100,':');
in>>b;
if(a>b) {x=3;y=0;}
else if(a<b) {x=0;y=3;}
else x=y=1;
t[i1].score+=x; t[i2].score+=y;
t[i1].clearBall+=a-b; t[i2].clearBall+=b-a;
t[i1].ball+=a;t[i2].ball+=b;
}
sort(t,t+n,cmp);
sort(t,t+n/2,cmp2);
for(int i=0;i<n/2;i++)
cout<<t[i].name<<endl;
}