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 迁移至博客园。
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/19065135

浙公网安备 33010602011771号