code forces 394A Counting Sticks

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既可以增加竞争成分,又能完善题目数据,赞啊~!得意






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值