【多过程模拟】CodeForce 19A——World Football Cup

本文介绍了一个模拟足球小组赛过程及最终排名的程序设计案例。该程序使用C++实现,考虑了比赛胜负和平局的不同得分情况,并根据积分、净胜球、进球数以及字典序确定队伍排名。

题目:点击打开链接

纯模拟题,模拟一个小组中的出线情况。注意情况:

1、胜3平1负0不多说。分数相等比较净胜球,净胜球相等比较进球数,进球数相等输出字典序。

2、无论怎样,输出总是按照字典序。

这个问题基本上是考排序的细节,当然,还有字符串的处理。寻找'-'字符,可以通过string类中的int find_first_of(char a)来直接解决。找到队伍的位置操作便是。变量略多,最好取一些清晰易懂的名字,别写来写去把自己绕进去了。。1A,难得。。

#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;

class team
{
	public:
		string teamname;
		int marks;
		int goal;
		int loss;
};

team football[55];

bool cmp(team a,team b)
{
	if(a.marks!=b.marks)
		return a.marks>b.marks;
	else
	{
		int adec=a.goal-a.loss;
		int bdec=b.goal-b.loss;
		if(adec!=bdec)
		{
			return adec>bdec;
		}
		else
		{
			return a.goal>b.goal;
		}
	}
	
}

bool cmpdic(team a,team b)
{
	return a.teamname<b.teamname;   //不要用strcmp,貌似只比较了首字母 
}

int main()
{
	int teamnum;
	cin>>teamnum;
	for(int i=1;i<=teamnum;i++)
	{
		string name;
		cin>>name;
		football[i].teamname=name;
	}
	for(int j=1;j<=(teamnum*(teamnum-1)/2);j++)
	{
		string teaminfo;//原始信息 
		string teama,teamb;//队名记录 
		int marksa,marksb;//分数记录 
		int rema,remb;//位置记录 
		char temppos;
		cin>>teaminfo;
		
		int pos=teaminfo.find_first_of('-',0);
		for(int p=0;p<pos;p++)
			teama+=teaminfo[p];
		for(int t=pos+1;t<teaminfo.size();t++)
			teamb+=teaminfo[t];
			
		//teamb=teaminfo.assign(teaminfo.begin()+pos,teaminfo.end());     //不知为何不能用 
		
		cin>>marksa>>temppos>>marksb;
		
		for(int j=1;j<=teamnum;j++)
		{
			if(football[j].teamname==teama)
			{
				rema=j;
			}
			if(football[j].teamname==teamb)
			{
				remb=j;
			}
		}
		
		if(marksa>marksb)
		{
			football[rema].marks+=3;
		}
		else if(marksa==marksb)
		{
			football[rema].marks+=1;
			football[remb].marks+=1;
		}
		else
		{
			football[remb].marks+=3;
		}
		
		football[rema].goal+=marksa;
		football[rema].loss+=marksb;
		football[remb].goal+=marksb;
		football[remb].loss+=marksa;				
	//	cout<<teama<<endl;
	//	cout<<teamb<<endl;
		
	}
	sort(football+1,football+teamnum+1,cmp);
	sort(football+1,football+(teamnum/2)+1,cmpdic);
	
	for(int k=1;k<=(teamnum/2);k++)
	{
		cout<<football[k].teamname<<endl;
	}
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值