生活随笔
收集整理的這篇文章主要介紹了
NYOJ--1236--挑战密室(第八届河南省程序设计大赛)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
挑戰密室
時間限制:1000?ms ?|? 內存限制:65535?KB 難度:4 描述
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行,每行為一個化學方程式輸出
對于每個化學方程式輸出一行:即密碼。樣例輸入
3
2C+O2=2CO
2NaOH+H2SO4=Na2SO4+2H2O
Ca2CO3+H2O=Ca2(OH)2+CO2
樣例輸出
0056
0142
0116
提示
2≤K≤8 ,化學方程式的長度不超過50, 所有原子,分子的數量不超過9.小括號最多一層.來源
第八屆河南省程序設計大賽 1 /*
2 Name: NYOJ--1236--挑戰密室(第八屆河南省程序設計大賽)
3 Copyright: ?2017 日天大帝
4 Author: 日天大帝
5 Date: 03/05/17 20:48
6 Description: 思路:
7 1.先處理開頭的數字
8 2.每次處理一個元素,如果后面跟有數字,一起處理后入棧
9 3.遇到(之后每個元素都入棧一個(
10 4.遇到)先出隊兩個(因為兩個元素只計算一次,卻進棧了3個(、
11 5.將數值棧中的元素出棧累加
12 6乘以開頭數字輸出
13 比賽沒調完,比賽調了一下直接A了o(╯□╰)o
14 */
15 #include<stack>
16 #include<map>
17 #include<iomanip>
18 #include<iostream>
19 using namespace std;
20 map<
string,
int>
mymap;
21 stack<
int>
num;
22 stack<
char>
op;
23 void init(){
24 while(!
num.empty())num.pop();
25 while(!
op.empty())op.pop();
26 mymap[
"N"] =
14;
27 mymap[
"C"] =
12;
28 mymap[
"O"] =
16;
29 mymap[
"Cl"] =
35;
30 mymap[
"S"] =
32;
31 mymap[
"H"] =
2;
32 mymap[
"Al"] =
27;
33 mymap[
"Ca"] =
40;
34 mymap[
"Zn"] =
65;
35 mymap[
"Na"] =
23;
36 }
37 int check(
char ch,
char c){
38 if(c ==
'!' || isdigit(c))
return 1;
39 if(ch ==
'O' || ch ==
'S' || ch ==
'H')
return 1;
40 else if((ch ==
'N' && c ==
'a') || (ch ==
'C' && c ==
'l') || (ch ==
'C' && c ==
'a'))
return 0;
41 else if(ch ==
'N' || ch==
'C')
return 1;
42 else return 0;
43 }
44 int main(){
45 ios::sync_with_stdio(
false);
46 int k;cin>>
k;
47 init();
48 while(k--
){
49 string str;cin>>
str;
50 int st = str.find(
"=");
51 string s = str.substr(st+
1);
52 int en = s.find(
"+");
53 s = s.substr(
0,en);
54 s +=
"!";
//加一個標記判斷最后的元素是一個還是兩個字符
55 int i=
0;
56 int res =
0;
57 while(isdigit(s[i])){
//將開始的數字提取出來單獨處理
58 res *=
10;
59 res += s[i] -
'0';
60 i++
;
61 }
62 if(res ==
0)res =
1;
63 while(i < s.size()){
//循環遍歷字符串
64 if(isalpha(s[i])){
//是字母
65 if(check(s[i],s[i+
1]) ==
0){
//判斷是否為兩位的元素
66 string temp =
"";
67 temp +=
s[i];
68 temp += s[i+
1];
69 int x =
0;
70 if(isdigit(s[i+
2])){
71 while(isdigit(s[i+
2])){
72 x *=
10;
73 x += s[i+
2] -
'0';
74 i++
;
75 }
76 }
77 if(x !=
0)num.push(mymap[temp] *
x);
78 else num.push(mymap[temp]);
79 if(!op.empty())op.push(
'(');
80 i +=
2;
81 }
else{
//一位的元素
82 string temp =
"";
83 temp +=
s[i];
84 int x =
0;
85 while(isdigit(s[i+
1])){
86 x *=
10;
87 x += s[i+
1] -
'0';
88 i++
;
89 }
90 if(x !=
0)num.push(mymap[temp] *
x);
91 else num.push(mymap[temp]);
92 if(!op.empty())op.push(
'(');
93 i++
;
94 }
95 }
else if(s[i] ==
'('){
//(括號
96 op.push(
'(');
97 i++
;
98 }
else if(s[i] ==
')'){
//)括號
99 op.pop();op.pop();
100 while(!
op.empty()){
101 int a =
num.top();num.pop();
102 int b =
num.top();num.pop();
103 num.push(a+
b);
104 op.pop();
105 }
106 i++
;
107 if(isdigit(s[i])){
108 int x =
num.top();num.pop();
109 x *= s[i] -
'0';
110 num.push(x);
111 }
112 i++
;
113 }
114 else i++;
//加!標記結尾了
115 }
116 int ans =
0;
117 while(!num.empty()){
//將數字棧中所有數字出棧
118 ans +=
num.top();
119 num.pop();
120 }
121 cout<<setw(
4)<<setfill(
'0')<<res*ans<<
endl;
122 }
123 return 0;
124 }
?
轉載于:https://www.cnblogs.com/evidd/p/6803855.html
總結
以上是生活随笔為你收集整理的NYOJ--1236--挑战密室(第八届河南省程序设计大赛)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。