刷题随记 洛谷P1042 [NOIP2003 普及组] 乒乓球 边界约束错误,不要用一个点来约束,尽可能以区间的形式约束

博客作者通过分析在解决洛谷P1042 [NOIP2003 普及组] 乒乓球问题时遇到的错误,强调了审题和边界条件的重要性。第一次错误是由于未考虑到比分相差不超过2的情况,而第二次错误则是因为在修正后仍使用单一边界点,而不是区间约束。最终,作者提供了AC代码,并提醒在编程中注意边界条件的全面性。

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

洛谷P1042 [NOIP2003 普及组] 乒乓球.
在这里插入图片描述

第一次错误代码

#include<bits/stdc++.h>
using namespace std;
string a,c;
int l,r;
int len;
int main()
{
	while(cin>>c)
	{
		a=a+c;
	}
	len=a.length();
	for(int i=0;i<len;i++)
	{
		if(a[i]=='W')
		{
			l++;
			if(l==11)     //错误位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='L')
		{
			r++;
			if(r==11)     //错误位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='E')
		{
			cout<<l<<":"<<r<<endl;break;
		}
	}
	l=r=0;
	cout<<endl;
	for(int i=0;i<len;i++)
	{
		if(a[i]=='W')
		{
			l++;
			if(l==21)     //错误位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='L')
		{
			r++;
			if(r==21)     //错误位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='E')
		{
			cout<<l<<":"<<r<<endl;break;
		}
	}
	return 0;
}

原因分析

审题不清,未考虑到比分相差不超过2的情况

第二次错误代码

#include<bits/stdc++.h>
using namespace std;
string a,c;
int l,r;
int len;
int main()
{
	while(cin>>c)
	{
		a=a+c;
	}
	len=a.length();
	for(int i=0;i<len;i++)
	{
		if(a[i]=='W')
		{
			l++;
			if(l==11&&l-r>=2)      //仍然出错位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='L')
		{
			r++;
			if(r==11&&r-l>=2)      //仍然出错位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='E')
		{
			cout<<l<<":"<<r<<endl;break;
		}
	}
	l=r=0;
	cout<<endl;
	for(int i=0;i<len;i++)
	{
		if(a[i]=='W')
		{
			l++;
			if(l==21&&l-r>=2)      //仍然出错位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='L')
		{
			r++;
			if(r==21&&r-l>=2)      //仍然出错位置
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='E')
		{
			cout<<l<<":"<<r<<endl;break;
		}
	}
	return 0;
}

原因分析

在第一次改正后,边界判断继续出错。因为当比分相差大于二时,边界条件就不一定是11或21了
所以以后边界条件尽量不要用一个点来约束,尽可能以区间的形式约束

AC代码

#include<bits/stdc++.h>
using namespace std;
string a,c;
int l,r;
int len;
int main()
{
	while(cin>>c)
	{
		a=a+c;
	}
	len=a.length();
	for(int i=0;i<len;i++)
	{
		if(a[i]=='W')
		{
			l++;
			if(l>=11&&l-r>=2)
			{
//				cout<<l<<":"<<r<<endl;	
				printf("%d:%d\n",l,r);
				l=r=0;
			}
		}
		if(a[i]=='L')
		{
			r++;
			if(r>=11&&r-l>=2)
			{
//				cout<<l<<":"<<r<<endl;
				printf("%d:%d\n",l,r);
				l=r=0;
			}
		}
		if(a[i]=='E')
		{
//			cout<<l<<":"<<r<<endl;
			printf("%d:%d\n",l,r);
			break;
		}
	}
	l=r=0;
//	cout<<endl;
	printf("\n");
	for(int i=0;i<len;i++)
	{
		if(a[i]=='W')
		{
			l++;
			if(l>=21&&l-r>=2)
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		if(a[i]=='L')
		{
			r++;
			if(r>=21&&r-l>=2)
			{
				cout<<l<<":"<<r<<endl;
				l=r=0;
			}
		}
		
		if(a[i]=='E')
		{
			cout<<l<<":"<<r<<endl;break;
		}
	}
	return 0;
}

两次改正后终于AC了,约束条件(尤其是第一次错过后再看看是否其他条件也会改变)还是要注意啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值