code forces 394A Counting Sticks 题目链接:http://codeforces.com/problemset/problem/394/A
题目大意:关于算筹的问题,以算筹(“|”)的形式给出一个形如A+B=C的等式,调整A、B、C中任一一根算筹的位置(也可以不调整),使等式成立。
题目分析:首先要判断需不需要调整、能不能调整、有没有可能调整出等式,通过加号、等号和串结束符的位置可以计算出A、B、C的值,就可以判断了。显然在A、B间挪动是没有意义的,等号两边调整一根相当于把一边加一、另一边减一,所以可能调整出等式的情况就是等号两边的数相差2;不需要调整的情况自不必说;那么其它的情况就是Impossible了。虽然还有点不对头,但这样写出来交上就已经能过pretest了,被人hack了思路才拉回来。移动之后会不会有0呢?位置为空是不是不行呢?答案是肯定的,稍作分析可得,如果只剩一根还把它拿走,那这个位置就是空了,C是不可能会空的,可以证明如果C==1,那么A+B不可能等于-1,所以这个问题只可能存在于等号左边。之前为了方便,如果需要把等号左边的一根移动到等号右边,我就只移动A,现在加一个判断,如果A==1,就去移动B。至此分析结束。
code:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int a,b,c,add,equ,i;
string s;
cin>>s;
add=s.find("+");
equ=s.find("=");
a=add;
b=equ-add-1;
c=s.size()-equ-1;
//cout<<a<<b<<c<<endl;
if(c==a+b)cout<<s<<endl;
else if(c-a-b==2)
{
for(i=0;i<=a;i++)
{
cout<<"|";
}
cout<<"+";
for(i=0;i<b;i++)
{
cout<<"|";
}
cout<<"=";
for(i=0;i<c-1;i++)
{
cout<<"|";
}
cout<<endl;
}
else if(a+b-c==2)
{
if(a==1)
{
for(i=0;i<a;i++)
{
cout<<"|";
}
cout<<"+";
for(i=0;i<b-1;i++)
{
cout<<"|";
}
cout<<"=";
for(i=0;i<=c;i++)
{
cout<<"|";
}
cout<<endl;
return 0;
}
for(i=0;i<a-1;i++)
{
cout<<"|";
}
cout<<"+";
for(i=0;i<b;i++)
{
cout<<"|";
}
cout<<"=";
for(i=0;i<=c;i++)
{
cout<<"|";
}
cout<<endl;
}
else cout<<"Impossible"<<endl;
}
PS:CF的比赛机制太棒了,这个hack既可以增加竞争成分,又能完善题目数据,赞啊~!