ccf练习题 世界杯来了

该博客介绍了一个用于模拟世界杯比赛的C++程序,程序根据输入的球队名单和比赛结果,确定进入淘汰赛的队伍。程序通过读取输入,计算各队得分、净胜球和进球数,然后按规则排序得出晋级名单。博客内容涉及数据结构、排序算法和竞赛逻辑,适合对编程和体育数据分析感兴趣的读者阅读。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】

   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;
}

欢迎大佬指正 ^ _ ^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值