Nguồn đề bài: http://vn.spoj.com/problems/MMASS/
1. Đề bài MMASS PTIT121E spoj
Hóa chất chỉ gồm các nguyên tố C, H, O có trọng lượng 12,1, 16 tương ứng.
Nó được biểu diễn dạng “nén”, ví dụ COOHHH là CO2H3 hay CH (CO2H) (CO2H) (CO2H) là CH(CO2H)3. Nếu ở dạng nén thì số lần lặp >=2 và <=9.
Tính khối lượng hóa chất.
Input
Gồm một dòng mô tả hóa chất không quá 100 kí tự chỉ gồm C, H, O, (, ), 2,..,9.
Output
Khối lượng của hóa chất (luôn <=10000).
Example
INPUT | OUTPUT |
COOH | 45 |
INPUT | OUTPUT |
CH(CO2H)3 | 148 |
INPUT | OUTPUT |
((CH)2(OH2H)(C(H))O)3 | 222 |
2. Gợi ý MMASS PTIT121E spoj
– Ứng dụng stack. xem code mẫu để hiểu rõ hơn
3. Code tham khảo MMASS PTIT121E spoj
const fi=''; var s:string; n:longint; f:text; Stack:array[0..100+50] of longint; last,i,tmp,stmp:longint; function KL(x:char):longint; begin if x='C' then exit(12); if x='O' then exit(16); exit(1); end; procedure add(x:longint); begin inc(last); stack[last]:=x; end; function push:longint; begin push:=stack[last]; dec(last); end; begin assign(f,fi); reset(f); readln(f,s); close(f); n:=length(s); last:=0; for i:=1 to n do begin if s[i]='(' then begin add(0); continue; end; if s[i] in ['C','H','O'] then begin add(KL(s[i])); continue; end; if s[i] in ['2'..'9'] then begin add((ord(s[i])-48)*push); continue; end; if s[i]=')' then begin stmp:=0; while last<>0 do begin tmp:=push; if tmp=0 then break; stmp:=stmp+tmp; end; add(stmp); end; end; tmp:=0; for i:=1 to last do inc(tmp,stack[i]); writeln(tmp); end.