东华大学2020考研计算机OJ题目解答分享——进阶篇(65)

65 乒乓球

作者: ZhouMingLiang 时间限制: 10S章节: 字符串

问题描述 :

国际乒联主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。明明就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,明明首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。 (注:11(21)分制,在一局比赛中,选手A先得到11(21)分且此时领先选手B 2分或2分以上时,则选手A赢得此局;若当双方打成10(20)平后,则先多得2分的一方为胜方,赢得此局。)

明明通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。一局比赛的开始比分为0比0。 比如现在有这么一份记录,(其中W表示明明获得一分,L表示明明的对手获得一分):

WWWWWWWWWWWWWWWWWWWWWWLW

在11分制下,此时比赛的结果是明明第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。

在21分制下,此时比赛结果是明明第一局21比0获胜,正在进行第二局,当前比分2比1。

再如有这么一份记录,(其中W表示明明获得一分,L表示明明的对手获得一分):

WLWLWLWLWLWLWLWLWLWLWLWLWL

在11分制下,此时比赛的结果是明明和对手打成13比13,这局比赛仍没有分出胜负,因为任何一方都没有领先其对手2分。

在21分制下,此时比赛的结果是明明和对手打成13比13,这局比赛仍在进行中。

由于明明参加过多年的比赛,比赛的数据量相当庞大,如果仅仅使用手工统计,在短时间内统计出结果对于明明来说是相当困难的。因此明明求助于你,希望你能写一个程序,帮助他快速地统计出结果来。

明明的问题可以归结为:给你一系列的比赛数据(WL形式),分别按照11分制和21分制的比赛规则进行统计,然后输出统计结果。

输入说明 :

你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每行包括一串有W、L和E组成比赛结果,其中W表示明明得一分,L表示明明的对手得一分,E表示该组测试数据的结束,也就是说E后面的W、L应该忽略,无需处理。每行的长度不会超过30个字符。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :

对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。

每组运算结果由两部分组成,其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。

每部分由若干行组成,每一行对应一局比赛的比分(按比赛信息输入顺序),每局的比分按如下形式表示:m:n,其中m表示明明的得分,n表示明明的对手的得分,m、n之间用一个冒号隔开。

输出时,每组运算结果与其后一组运算结果之间有一个空行,第一组运算结果前面以及最后一组运算结果后面没有任何空行或其他任何字符。 注:通常,显示屏为标准输出设备。

输入范例 :

WWWWWWWWWWLLLLLLLLLLL
WWWWWWWWWLLLLLLLLLE
LLLLLLLLLLLLLLLLLE

输出范例 :

13:11
6:9

19:20

0:11
0:6

0:17

解答思路:

遍历即可,注意数组大小。本来开了长度100没想到还是有用例溢出了,尽量开大。

AC代码

#include 
#include 

void rule11(char a[],int len)
{
     
	int m=0,n=0;
	for(int i=0;i<len;i++)
	{
     
		if(a[i]=='W')
		{
     
			m++;
		}
		else if(a[i]=='L')
		{
     
			n++;
		}
		
		if((m>=11||n>=11)&&(m-n>=2||n-m>=2))
		{
     

				printf("%d:%d\n",m,n);
				m=0;
				n=0;

		}
		
	}
	if(m!=0||n!=0)
	printf("%d:%d\n",m,n);	
	
	
	
}

void rule21(char a[],int len)
{
     
	int m=0,n=0;
	for(int i=0;i<len;i++)
	{
     
		if(a[i]=='W')
		{
     
			m++;
		}
		else if(a[i]=='L')
		{
     
			n++;
		}
		
		if((m>=21||n>=21)&&(m-n>=2||n-m>=2))
		{
     
	
				printf("%d:%d\n",m,n);
				m=0;
				n=0;
		
		}
		
	}
	if(m!=0||n!=0)
	printf("%d:%d\n",m,n);	
	
	
	
}



int main(){
     
char a[500];
memset(a,0,sizeof(a));

while(~scanf("%c",&a[0]))
{
     
	int i=1;
	for(i;;i++)
	{
     
		scanf("%c",&a[i]);
		if(a[i]=='E')
		{
     
			break;
		}
	}
	
	rule11(a,i+1);
	printf("\n");
	rule21(a,i+1);
	printf("\n");
	memset(a,0,sizeof(a));

	
}








}

你可能感兴趣的:(c++)