【程序设计训练】1-6 世界杯来了

问题描述

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哈伦HL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值