我只能说好麻烦的一道题呀*……* 需要注意好多细节,然后考虑很多东西
问题 A: 挑战密室
时间限制: 1 Sec 内存限制: 64 MB提交: 11 解决: 8
[提交][状态][讨论版]
题目描述
R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室。Dr. Kong必须尽快找到解锁密码逃离,否则几分钟之后,WTO密室即将爆炸。
Dr. Kong发现密室的墙上写了许多化学方程式中。化学方程式,也称为化学反应方程式,是用化学式表示物质化学反应的式子。化学方程式反映的是客观事实。因此书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。
化学方程式不仅表明了反应物、生成物和反应条件。同时,化学计量数代表了各反应物、生成物物质的量关系,通过相对分子质量或相对原子质量还可以表示各物质之间的质量关系,即各物质之间的质量比。对于气体反应物、生成物,还可以直接通过化学计量数得出体积比。例如:2NaOH+H2SO4=Na2SO4+2H2O
经过多次试探、推理,Dr. Kong发现密码是4位数字,就隐藏在化学方程式等号后的第一个分子中,其分子量就可能是密码(若分子量不足4位,前面加0)。
好在Dr. Kong还记得墙上各化学方程式用到的化学元素的原子量如下:
N |
C |
O |
Cl |
S |
H |
Al |
Ca |
Zn |
Na |
14 |
12 |
16 |
35 |
32 |
2 |
27 |
40 |
65 |
23 |
你能帮Dr. Kong尽快找到密码吗?
输入
输出
样例输入
32C+O2=2CO2NaOH+H2SO4=Na2SO4+2H2OCa2CO3+H2O=Ca2(OH)2+CO2
样例输出
005601420116
提示
2≤K≤8 ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <map>
#include <vector>
#include <queue>
using namespace std;
typedef long long LL;
#define N 600
#define met(a, b) memset(a, b, sizeof(a))
#define INF 0x3f3f3f3f
char s[N];
int Find(int x, int len)
{
int i;
for(i=x; i<=len; i++)
if(s[i]=='=')
return i+1;
}
int Find2(int x, int len)
{
int i;
for(i=x; i<=len; i++)
if(s[i]=='+')
return i-1;
return len;
}
int Find1(int x)
{
int i, len = strlen(s)-1;
for(i=x; i<len; i++)
if(s[i]==')')
return i-1;
return len;
}
int Slove(int start, int e)
{
int k=0,sum=0,pre,i;
for(i=start;i<=e;i++)
{
if(s[i]>='0'&&s[i]<='9')
k=k*10+s[i]-'0';
else break;
}
for( ;i<=e; i++)
{
if(s[i]=='N')
{
if(s[i+1]=='a')
{
sum += 23;
pre = 23;
i++;
}
else
{
sum += 14;
pre = 14;
}
}
else if(s[i]=='C')
{
if(s[i+1]=='l')
{
sum += 35;
pre = 35;
i++;
}
else if(s[i+1]=='a')
{
sum += 40;
pre = 40;
i++;
}
else
{
sum += 12;
pre = 12;
}
}
else if(s[i]=='O')
{
sum += 16;
pre = 16;
}
else if(s[i]=='S')
{
sum += 32;
pre = 32;
}
else if(s[i]=='H')
{
sum += 2;
pre = 2;
}
else if(s[i]=='A')
{
sum += 27;
pre = 27;
i++;
}
else if(s[i]=='Z')
{
sum += 65;
pre = 65;
i++;
}
else if(s[i]=='(')
{
int Index = Find1(i);
int w = Slove(i+1, Index);
sum += w;
pre = w;
i = Index+1;
}
else
{
int z=0;
while(s[i]>='0' && s[i]<='9')
{
z = z*10 + s[i]-'0';
i++;
}
i--;
sum += (z-1)*pre;
}
}
if(k==0) return sum;
else return k*sum;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int Index1, Index2, sum, len;
scanf("%s", s);
len = strlen(s)-1;
Index1 = Find(0, len);
Index2 = Find2(Index1, len);
sum = Slove(Index1, Index2);
printf("%04d\n", sum);
}
return 0;
}