我只能說好麻煩的一道題呀*……* 需要注意好多細節,然後考慮很多東西
問題 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;
}