[NOIP2003 普及组] 乒乓球 解题思路及代码

文章讲述了作者在解决NOIP2003普及组乒乓球问题时遇到的编程挑战,包括理解比赛规则、完善代码逻辑,特别是处理不同赛制和比赛结束条件。

先放个题目:

以及题目链接:

P1042 [NOI​​​​​​P2003 普及组] 乒乓球 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)​​​​​​icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P1042

 然后是我的代码

#include<iostream>
using namespace std;
char list[62750];
int main()
{
	char a;
	int i=0;
	int hwin=0,lwin=0;	//记录实时分数 
	int winscore11=11,winscore21=21; 
	while(cin>>a){	//输入比赛结果 
		list[i]=a;
		if(a=='E')
			break;
		i++;
	}	
	if(list[0]=='E'){	//判断一把没打的情况 
		cout<<"0:0"<<endl<<endl<<"0:0";
		return 0;
	}
	for(int k=0;k<i;++k){	//11分赛制的结果 
		if(list[k]=='W'){
			hwin+=1;
			if(hwin==winscore11){
				if(hwin-lwin<2)	//判断分差是否大于等于2 
					winscore11++;
				else{
					cout<<hwin<<":"<<lwin<<endl;
					hwin=0;
					lwin=0;
					winscore11=11;
				}
			}
		}
		else{
			lwin+=1;
			if(lwin==winscore11){
				if(lwin-hwin<2)//判断分差是否大于等于2
					winscore11++;
				else{
					cout<<hwin<<":"<<lwin<<endl;
					hwin=0;
					lwin=0;
					winscore11=11;
				}
			}
		}
	} 
	if(hwin!=0||lwin!=0)		//如果最后一局没结束,打印最后一局的结果 
		cout<<hwin<<":"<<lwin<<endl;
	else
		cout<<"0:0"<<endl;	//如果结束,输出0:0; 
	cout<<endl;
	hwin=0;	//重置数据 
	lwin=0;
	for(int k=0;k<i;++k){	//21分赛制的结果 
		if(list[k]=='W'){
			hwin+=1;
			if(hwin==winscore21){
				if(hwin-lwin<2)//判断分差是否大于等于2
					winscore21++;
				else{
				cout<<hwin<<":"<<lwin<<endl;
				hwin=0;
				lwin=0;
				winscore21=21;
				}
			}
		}
		else{
			lwin+=1;
			if(lwin==winscore21){
				if(lwin-hwin<2)//判断分差是否大于等于2
					winscore21++;
				else{
				cout<<hwin<<":"<<lwin<<endl;
				hwin=0;
				lwin=0;
				winscore21=21;
				}
			}
		}
	} 
	if(hwin!=0||lwin!=0)		//如果最后一局没结束,打印最后一局的结果 
		cout<<hwin<<":"<<lwin<<endl;
	else
		cout<<"0:0"<<endl;	//如果结束,输出0:0;
	return 0;
}

接下来说说我做的时候的思维难点 :

写完代码,提交,发现十个检查点过了四个,开始检查题目逻辑。
1.我第一步是卡在了比分差必须大于等于二,我没理解这句话的意思,还以为是大的对局比分,后面去查了下乒乓球规则才明白(不玩乒乓球导致的)。这步修改完过了8个检查点

2.然后我发现我少了第一个数据就是E的情况,加上,过了九个检查点

3.最后一个是我找最久的,我没想到在

if(hwin!=0||lwin!=0)		//如果最后一局没结束,打印最后一局的结果 
		cout<<hwin<<":"<<lwin<<endl;
	else
		cout<<"0:0"<<endl;	//如果结束,输出0:0;

这里能出问题,我的原代码是

if(hwin!=0||lwin!=0)		//如果最后一局没结束,打印最后一局的结果 
		cout<<hwin<<":"<<lwin<<endl;
	

 然后最后抱着试一试的心态,把最后就算一把都没有了还是要输出0:0的情况加上,然后过了!!!离谱!!!

by——2023.11.4刷题记录

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值