問題 A: 挑戰密室 河南省第九屆省賽

我只能說好麻煩的一道題呀*……*  需要注意好多細節,然後考慮很多東西

問題 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儘快找到密碼嗎?

輸入

第一行: K,表示有K個化學方程式; 接下來有K行,每行爲一個化學方程式

輸出

對於每個化學方程式輸出一行:即密碼。

樣例輸入

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;
}


發佈了24 篇原創文章 · 獲贊 28 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章