CCF 2019 12 3 化學方程式(80分)

2021-10-22 20:57:01 字數 2278 閱讀 3259

只考慮不含巢狀括號的情況(80分)

思路(注:未用map儲存,使用vector儲存元素和個數):

(1)是否為 =:以=為界,將方程式分為左右兩部分

(2)是否為 +:以+為界,得到每一項

(3)是否為數字(需要有對應的變數記錄數字前一項的內容):

·數字前一項為字母:乘以對應元素

·數字前一項是否為 ):乘以括號對應元素

·否則,數字為該項開頭:乘以該項中的所有元素

(4)是否為 ( :修改變數,標誌括號開始

(5)是否為 ):修改變數,標誌括號結束

(6)是否為大寫字母:以大寫字母為界得到乙個新元素

同時判斷元素是否中括號中,記錄括號個數

(7)是否為小寫字母:小寫字母與其前面的字母為同一元素

(8)判斷:(當時未考慮重複元素,只要是遇到大寫字母就開啟乙個元素)

巢狀兩個迴圈,以方程式左邊為準,遍歷方程式右邊,遇到相同的就相減

最後左邊或右邊元素個數存在不為0的情況,則為n,否則為y

易錯點:數字不一定是一位數(由於未考慮這一點,一直是40分,改正後未80分),需用到字串轉數

參考100分思路

通過 dfs(map& m1,string str,int num1)

遞迴的思想一層一層去掉括號,括號內的規律一致,邊界為單個元素

80分**

#include

using

namespace std;

intisdigit

(char ch)

else

}bool

isuppercase

(char ch)

else

}bool

islowercase

(char ch)

else

}int

main()

else

stringstream ss;

int tempp;

ss<

ss>>tempp;

if(flag_case)

else

count=0;

}else}}

else

if(s[index]

==')')if

(isuppercase

(s[index]))

index++;}

if(islowercase

(s[index]))

}}} index++

;while

(index

else

stringstream ss;

int tempp;

ss<

ss>>tempp;

if(flag_caser)

else

countr=0;

}else}}

else

if(s[index]

==')')if

(isuppercase

(s[index]))

index++;}

if(islowercase

(s[index]))

}}}bool res=

true

;int k=0;

while

(ksize()

) string s1=left[k]

.first;

string s2=right[m]

.first;

if(right[m]

.second&&s1==s2)

else

if(number>0)

else

} m++;}

k++;}

for(

int h=

0;hsize()

;h++)}

if(res)}}

if(res)

else

left.

clear()

; right.

clear()

;}return0;

}

CCF 201912 3 化學方程式

化學方程式,也稱為化學反應方程式,是用化學式表示化學反應的式子。給出一組化學方程式,請你編寫程式判斷每個方程式是否配平。本題給出的化學方程式由大小寫字母 數字和符號組成,不會出現其他字元。詳見輸入樣例 判斷輸入的化學方程式是否配平,是則輸出y,否則輸出n。第一行乙個正整數n。接下來n行,每行乙個化學...

201912 3 化學方程式

試題編號 201912 3 試題名稱 化學方程式 時間限制 1.0s 記憶體限制 512.0mb 前四個測試點還是很好寫的,不過加入小寫字母要注意cu as cs au這種情況,不能只是判斷字元種類的數目是否相同 include include include include using names...

CCF 大模擬之化學方程式 201912 3

給出化學方程式,判斷是否配平,所有方程式符合規範 例如 h2 o2 h2o 2h2 o2 2h2o 解題思路 include using namespace std struct elem inttodigit string equat,int i return dig void calcuelem...