欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

201912-3 化学方程式

程序员文章站 2022-05-12 15:02:14
...

试题编号: 201912-3
试题名称: 化学方程式
时间限制: 1.0s
内存限制: 512.0MB
201912-3 化学方程式201912-3 化学方程式201912-3 化学方程式
前四个测试点还是很好写的,不过加入小写字母要注意Cu+As=Cs+Au这种情况,不能只是判断字符种类的数目是否相同

#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=30;
int pos;
int cnt[N],cntd[N][N];
int num(string &s)
{
	int t=0;
	while(isdigit(s[pos]))
	{
		t=t*10+(s[pos]-'0');
		pos++;
	}
	return t;
}
void count(string &s,int d)
{
	int len=s.size();
	pos=0;
	if(isdigit(s[0])) d*=num(s);
	while(pos<len)
	{
		if(isdigit(s[pos]))
		{
			int post=pos-1;
			int dd=num(s);
			if(islower(s[post]))
			{
				cntd[s[post-1]-'A'][s[post]-'a']+=d*(dd-1);
			}
			else
			{
				cnt[s[post]-'A']+=d*(dd-1);
			}
		}
		else if(islower(s[pos]))
		{
			cnt[s[pos-1]-'A']-=d;
			cntd[s[pos-1]-'A'][s[pos]-'a']+=d;
			pos++;
		}
		else if(isupper(s[pos]))
		{
			cnt[s[pos]-'A']+=d;
			pos++;
		}
		else if(s[pos]=='(')
		{
			int posr=s.find(')',pos),tt,dd=1;
			string sub=s.substr(pos+1,posr-pos-1);
			if(isdigit(s[posr+1]))
			{
				pos=posr+1;
				dd=num(s);
				tt=pos;
			}
			else tt=posr+1;
			count(sub,dd*d);
			pos=tt;
		}
	}
}
void sep(string &s,int d)
{
	int pos1=0,pos2=s.find('+');
	string sub;
	while(pos2!=-1)
	{
		sub=s.substr(pos1,pos2-pos1);
		count(sub,d);
		pos1=pos2+1;
		pos2=s.find('+',pos1);
	}
	sub=s.substr(pos1);
	count(sub,d);
}
int main()
{
	int n;
	cin>>n;
	while(n--)
	{
		memset(cnt,0,sizeof cnt);
		memset(cntd,0,sizeof cntd);
		string s,sl,sr;
		cin>>s;
		int pos=s.find('=');
		sl=s.substr(0,pos);
		sr=s.substr(pos+1);
		sep(sl,1);
		sep(sr,-1);
		bool flag=true;
		for(int i=0;i<N;i++)
		{
			if(cnt[i]!=0)
			{
				flag=false;
				break;
			}
		}
		if(flag)
		{
			for(int i=0;i<N;i++)
			for(int j=0;j<N;j++)
			{
				if(cntd[i][j]!=0)
				{
					flag=false;
					break;
				}
			}
			if(flag) cout<<"Y"<<endl;
			else cout<<"N"<<endl;
		}
		else cout<<"N"<<endl;
	}
	return 0;
}
/*
10
H2+O2=H2O
2H2+O2=2H2O
H2+2Cl=2NaCl
H2+2Cl=2HCl
CH4+2O2=CO2+2H2O
CaCl2+2AgNO3=Ca(NO3)2+2AgCl
3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2
3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O
4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O
Cu+As=Cs+Au
*/

个人觉得圆括号的嵌套性价比是在不高,所以就没考虑嵌套情况,代码只有80分。。。

相关标签: csp