P8324
02Ljh
·
·
题解
题意
给我们一个化学式,让我检查该化学式有没有配平。如果配平了,输出 DA,否则输出NE
配平(学过的可以自动跳过)
化学反应方程式严格遵守质量守恒定律
说人话,配平就是化学方程式中等号 ( \to 号)两端每个元素数量都一样
举个栗子:
## tips
这题其实非常水。
根据上面的分析,我们只需要扫一遍该化学式,统计化学式前后的元素数量,开一个结构体,以 $\to$ 作为化学式前后的分隔,分别统计之后再检查就行了。
(具体细节见代码)
## 易错点
~~话说只有我这种蒟蒻会错~~
1. 多测不清空,爆 0 两行泪!!!
2. 字符转成整数一定要 -'0' !!!
3. $2\text{H}_2\text{O}$ 指的是 $2(\text{H}_2\text{O})$ 而不是 $2\text{H}_2$ 和 $\text{O}$ !!!
## code
```cpp
#include <bits/stdc++.h>
using namespace std;
struct node
{
bool f=false;//这个元素有没有被访问过
int f_num=0;//这元素在化学式前面的数量
int e_num=0;//这元素在化学式后面的数量
} ;
bool deal()
{
node xy[1001];
int flag=1;//1表示前半部分 -1表示后半部分
int tim=-1;//tim表示整个化学式的系数( 2H2O 中的 2 )
string s;
cin>>s;
int len=s.size();
for(int i=0;i<len;i++)
{
if(s[i]=='-'&&s[i+1]=='>') { flag=-1; tim=-1; i++; continue; }//分隔化学的前半部分和后半部分,更新flag
if(tim==-1)
{
if(isdigit(s[i])) { tim=s[i]-'0'; continue; }//将化学式的系数的值赋给tim。
else tim=1;//如果该化学式没有系数,那么系数就是1
}
if(s[i]=='+') { tim=-1; continue; }//遇到连接化学式的时候,清零tim
if(isdigit(s[i])&&isalpha(s[i-1])&&i!=0)//处理 H20 中的 H2 (该化学式的原子数)
{
int w=s[i]-'0';
w=w*tim;//该元素的原子数乘上系数
xy[(int)(s[i-1])].f=true;//标记为访问过
if(flag==1) xy[(int)(s[i-1])].f_num+=w;//分别处理化学式的前后部分
else xy[(int)(s[i-1])].e_num+=w;
}
if(isalpha(s[i])&&!isdigit(s[i+1]))
{//处理 H2O 中的 O 部分(只有一个元素单质的)
xy[(int)(s[i])].f=true;
if(flag==1) { xy[(int)(s[i])].f_num+=tim; }
else if(flag==-1) { xy[(int)(s[i])].e_num+=tim; }
}
}
for(int i='A';i<'z';i++)//从'A'到'z'依次查询
{
if(!xy[i].f) continue;//如果没有被使用过,循环继续
else
{
if(xy[i].e_num==xy[i].f_num) { continue; }//如果相等就继续
else return false;//否则直接结束
}
}
return true;
}
int main()
{
int n;
cin>>n;
while(n--)
{
if(deal()) puts("DA");
else puts("NE");
}
return 0;//完结撒花 qwq
}
//P8234
```
p.s QAQ 这是本蒟蒻发的第一个题解 都这么晚了我还在写题解 求管理员大大给过