CF394A Counting Sticks - 题解

题目要求给定一个可能正确的式子 \(a+b=c\),要求将其进行转换得到正确的式子。

因为题目要求“把等号左边移一根火柴棒到右边”,所以很容易看出有这几种情况是可以做到的:

\[a+b=c \]

直接就满足条件,不用移动。

\[\begin{cases} (a-1)+b=(c+1)\\ a+(b-1)=(c+1)\\ \end{cases}\]

分别代表在 \(a\) 中移动一根到 \(c\),以及在 \(b\) 中移动一根到 \(c\)

\[\begin{cases} (a+1)+b=(c-1)\\ a+(b+1)=(c-1)\\ \end{cases}\]

分别代表在 \(c\) 中移动一根到 \(a\),以及在 \(c\) 中移动一根到 \(b\)

稍加计算即可将其整理成三个式子:

\[\begin{cases} a+b=c\\ a+b=c+2\\ a+b=c-2\\ \end{cases}\]

这三种情况是可行的,否则是不行的(输出 Impossible)。

注意一点:输出不能为 ||+=||+||=|| 的形式(即 \(a\)\(b\)\(0\))。

其它细节看代码:

#include<cstdio>
using namespace std;

int a,b,c;

inline void Read()	//用于读入 a,b,c 
{
	char ch=getchar();
	while(ch=='|') a++,ch=getchar();
	ch=getchar();
	while(ch=='|') b++,ch=getchar();
	ch=getchar();
	while(ch=='|') c++,ch=getchar();
	return;
}
inline void Print(int x,int y,int z)	//用于输出指定“|”数量的等式 
{
	for(int i=1;i<=x;i++) printf("|");
	printf("+");
	for(int i=1;i<=y;i++) printf("|");
	printf("=");
	for(int i=1;i<=z;i++) printf("|");
	printf("\n");
	return;
}
int main()
{
	Read();		//输入 a,b,c 
	if(a+b==c) Print(a,b,c);	//情况1:满足条件直接输出 
	else if(a+b==c+2)			//情况2:从左往右移动火柴棒 
	{
		if(a!=1) Print(a-1,b,c+1);		//避免“0+b=c”的情况 
		else Print(a,b-1,c+1);
		/*
		不会出现 a+b=c+2 且 a,b 均为 1,输出 Impossinle 的情况
		因为若出现,则该式子必定为 1+1=0
		而题目中“a,b,c>=1”所以 c 不可能为 0
		故这里不用特判 b!=0 也能 AC 
		*/
	}
	else if(a+b==c-2)	//情况3:从右往左移动火柴棒 
		Print(a+1,b,c-1);	//c-2 为正整数,c-1也必定为正整数,这里也不用特判 
	else printf("Impossible\n");	//若以上情况都不满足,表明不可能得到正确的等式 
	return 0;
}

\[\frak{The ~ End} \]


2022-08-10 21:24 撰写于洛谷,2025-08-29 20:32 迁移至博客园。

posted @ 2025-08-29 20:33  Jerrycyx  阅读(6)  评论(0)    收藏  举报