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ì 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

INPUTOUTPUT
COOH45
INPUTOUTPUT
CH(CO2H)3148
INPUTOUTPUT
((CH)2(OH2H)(C(H))O)3222

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.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *