02/10/2018, 14:43
MMASS PTIT121E spoj – Nguyên tố hóa học
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ì ...
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | 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. |