Hướng dẫn giải của Mass of Molecule


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Lưu ý: Các code mẫu dưới đây chỉ mang tính tham khảo và có thể không AC được bài tập này

Code mẫu của flashmt

const m:array[1..3] of integer=(1,12,16);

var a:string;
    d:array[1..100] of integer;
    dau:array[1..100] of byte;
    re:integer;

procedure rf;
begin
     read(a);
end;

function mass(c:char):integer;
begin
     case c of
          'H':mass:=1;
          'C':mass:=12;
          'O':mass:=16;
     end
end;

procedure pr;
var i,j,t,l,k:byte; code:integer;
begin
     fillchar(dau,sizeof(dau),0);
     l:=length(a);  re:=0;
     for i:=1 to l do d[i]:=1;
     for i:=1 to l do
         if a[i]=')' then
         begin
              for j:=i-2 downto 1 do
                  if (a[j]='(') and (dau[j]=0) then
                  begin
                       dau[j]:=1;
                       if (ord(a[i+1])>=50) and (ord(a[i+1])<=57) then
                       begin
                            val(a[i+1],t,code);
                            for k:=j+1 to i-1 do
                                d[k]:=d[k]*t;
                       end;
                       break;
                  end;
         end
         else
         begin
              if (ord(a[i])>=50) and (ord(a[i])<=57) then
              begin
                   val(a[i],t,code);
                   d[i-1]:=d[i-1]*t;
              end;
         end;
     for i:=1 to l do
         if (a[i]='C') or (a[i]='H') or (a[i]='O') then
             re:=re+mass(a[i])*d[i];
end;

procedure wf;
begin
     write(re);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của happyboy99x

#include<cstdio>
#include<cstring>

int mass(char c) { return c == 'C' ? 12 : c == 'H' ? 1 : 16; }

char s[200];

int calc(int lo, int hi) {
    int res = 0;
    for(int i = lo; i <= hi;) 
        if(s[i] == '(') {
            int cnt = 1, st = i+1;
            for(++i; cnt != 0; ++i) 
                if(s[i] == ')') --cnt;
                else if(s[i] == '(') ++cnt;
            if(s[i] >= 0x30 && s[i] <= 0x39) res += calc(st,i-2) * (s[i++] - 0x30);
            else res += calc(st,i-2);
        } else {
            if(s[i+1] >= 0x30 && s[i+1] <= 0x39) res += mass(s[i]) * (s[(++i)++] - 0x30);
            else res += mass(s[i++]);
        }
    return res;
}

int main() {
    scanf("%s", s);
    printf("%d\n", calc(0, strlen(s) - 1));
    return 0;
}

Code mẫu của ladpro98

program mmass; //VNOI
const   maxN = 10000;
        fi='';
        fo='';
type mystack = record
        items: array[0..maxN] of longint;
        top:longint;
        end;
var     stack:mystack;
        s:ansistring;
        ch,num:set of char;
        inp,oup:text;
        i,temp:longint;
function toVal(c:char):longint;
begin
        if c = 'C' then exit(12)
        else if c = 'O' then exit(16)
        else if c = 'H' then exit(1);
end;

function toNum(c:char):longint;
begin
        exit(ord(c)-48);
end;

function isEmpty:boolean;
begin
        exit(stack.top=0);
end;

function pop:longint;
begin
       dec(stack.top);
       exit(stack.items[stack.top+1]);
end;

function get:longint;
begin
        exit(stack.items[stack.top]);
end;

procedure push(val:longint);
begin
        inc(stack.top);
        stack.items[stack.top]:=val;
end;

procedure setTop(val:longint);
begin
        stack.items[stack.top]:=val;
end;

procedure input;
begin
        assign(inp,fi);
        reset(inp);
        readln(inp,s);
        close(inp);
end;

begin
        input;
        s:=s+'0';
        ch:=['C','H','O'];
        num:=['2','3','4','5','6','7','8','9'];
        stack.top:=0;
        i:=1;
        while i<length(s) do
        begin
                if (s[i] in ch) and (s[i+1] in num) then
                begin

                        setTop(get+toVal(s[i])*toNum(s[i+1]));
                        inc(i,2);
                end
                else if s[i] in ch then
                begin
                        setTop(get+toVal(s[i]));
                        inc(i);
                end
                else if s[i] = '(' then
                begin
                        push(0);
                        inc(i);
                end
                else if (s[i] = ')') and (s[i+1] in num) then
                begin
                        temp:=pop*toNum(s[i+1]);
                        setTop(get+temp);
                        inc(i,2);
                end
                else if (s[i] = ')') then
                begin
                        setTop(pop+get);
                        inc(i);
                end;

        end;
        assign(oup,fo);
        rewrite(oup);
        write(oup,get);
        close(oup);
end.

Code mẫu của RR

//Written by Nguyen Thanh Trung
{$R+,Q+}
{$Mode objFPC}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=111;
  so:array['0'..'9'] of longint=(0,1,2,3,4,5,6,7,8,9);
var
  f1,f2:text;
  n:longint;
  s:string;
  stack,left:array[1..MAXN] of longint;
procedure openF;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF;
begin
  close(f1);
  close(f2);
end;
function cal(l,r:longint):longint;
var
  i,sum:longint;
begin
  sum:=0;
  i:=r+1;
  while i>l do
    begin
      i-=1;
      case s[i] of
        'C': sum+=12;
        'O': sum+=16;
        'H': sum+=1;
        '0'..'9': if s[i-1]=')' then
                    begin
                      sum+=cal(left[i-1]+1,i-2)*so[s[i]];
                      i:=left[i-1];
                    end
                  else
                    begin
                      sum+=cal(i-1,i-1)*so[s[i]];
                      i-=1;
                    end;
        ')': begin
               sum+=cal(left[i]+1,i-1);
               i:=left[i];
             end;
      end;
    end;
  exit(sum);
end;
procedure init;
var
  top,i:longint;
begin
  top:=0;
  for i:=1 to n do
    if s[i]='(' then
      begin
        inc(top);
        stack[top]:=i;
      end
    else if s[i]=')' then
      begin
        left[i]:=stack[top];
        dec(top);
      end;
end;
begin
  openF;
  readln(f1,s); n:=length(s);
  init;
  writeln(f2,cal(1,n));
  closeF;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>
#include <string.h>
int T(char a)
  {
  int t;         
  if(a=='C')
    t=12;
  else if(a=='H')
    t=1;
  else if(a=='O')
    t=16;
  return t;
  }
main()
  {
  char s[10001];
  int n,m,k,x,N=0,a[10001];
  scanf("%s",s);
  k=strlen(s);
  for(int i=0;i<k;i++)
    if(s[i]=='C'||s[i]=='H'||s[i]=='O')
      {
      int n=0;m=0,x=0;
      if(s[i+1]!='C'&&s[i+1]!='H'&&s[i+1]!='O'&&s[i+1]!='('&&s[i+1]!=')'&&(i+1)!=k)
        x=T(s[i])*(s[i+1]-48);
      else x=T(s[i]);
      for(int j=0;j<i;j++)
        {   
        if(s[j]=='(')
          n++;
        else if(s[j]==')')
          n--;
        }
      for(int j=i+1;j<k;j++)
        {
        if(n==0)
          break;      
        else if(s[j]=='(')
          {
          n++;
          m++;
          }
        else if(s[j]==')')
          {
          n--;
          if(m>0)                
             m--;
          else if(s[j+1]!='C'&&s[j+1]!='H'&&s[j+1]!='O'&&s[j+1]!='('&&s[j+1]!=')'&&(j+1)!=k)
             x*=(s[j+1]-48);
          }
        }                       
      N+=x;
      }
  printf("%d",N);                                                                
  //getch();
  }

Code mẫu của ll931110

Program MMASS;
        Const
                input  = '';
                output = '';
        Var
                  s: string;
                k,r: ansistring;
              stack: ansistring;
                  q: array[1..1000] of integer;
                top: integer;

Procedure convert1;
          Var
                f: text;
                i: integer;
          Begin
                Assign(f, input);
                        Reset(f);
                        Readln(f, s);
                Close(f);

                k:= s[1];
                For i:= 2 to length(s) do
                  If ('2' <= s[i]) and (s[i] <= '9') then
                    Begin
                        k:= k + ' * ';
                        k:= k + s[i];
                    End
                  else if (s[i] = 'C') or (s[i] = 'H') or (s[i] = 'O') or (s[i] = '(') then
                    Begin
                        If s[i - 1] <> '(' then k:= k + ' + ';
                        k:= k + s[i];
                    End
                  else k:= k + s[i];
          End;

Function priority(ch: char): integer;
         Begin
                Case ch of
                  '*': priority:= 2;
                  '+': priority:= 1;
                  '(': priority:= 0;
                End;
         End;

Function pop: char;
         Begin
                pop:= stack[length(stack)];
                Delete(stack, length(stack), 1);
         End;

Function get: char;
         Begin
                get:= stack[length(stack)];
         End;

Procedure convert2;
          Var
                i,top: integer;
                    x: char;
          Begin
                r:= '';
                stack:= '';

                For i:= 1 to length(k) do
                  Case k[i] of
                    '(': stack:= stack + k[i];
                    ')': Repeat
                             x:= pop;
                             If x <> '('then r:= r + x + ' ';
                         Until x = '(';

                '+','*': Begin
                             While (stack <> '')
                                and (priority(k[i]) <= priority(get)) do r:= r + pop + ' ';
                             stack:= stack + k[i];
                         End
                else
                        r:= r + k[i] + ' ';
                  End;

                While stack <> '' do r:= r + pop + ' ';
          End;

Procedure pushval(v: integer);
          Begin
                inc(top);
                q[top]:= v;
          End;

Function popval: integer;
         Begin
                popval:= q[top];
                dec(top);
         End;

Procedure convert3;
          Var
                      f: text;
                i,m1,m2: integer;
          Begin
                top:= 0;
                For i:= 1 to length(r) do
                       If r[i] = 'C' then pushval(12)
                  else if r[i] = 'H' then pushval(1)
                  else if r[i] = 'O' then pushval(16)
                  else if ('2' <= r[i]) and (r[i] <= '9') then pushval(ord(r[i]) - 48)
                  else if (r[i] = '+') or (r[i] = '*') then
                    Begin
                        m2:= popval;
                        m1:= popval;

                        If r[i] = '+' then m1:= m1 + m2;
                        If r[i] = '*' then m1:= m1 * m2;
                        pushval(m1);
                    End;

                Assign(f, output);
                        Rewrite(f);
                        Writeln(f,popval);
                Close(f);
          End;

Begin
        convert1;
        convert2;
        convert3;
End.

Code mẫu của khuc_tuan

//{$A8,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q+,R+,S+,T-,U-,V+,W-,X+,Y+,Z1}
// {$APPTYPE CONSOLE}
 {$mode delphi}

var
    a : array[0..110] of char;
    n : integer;

function get(l,r:integer):integer;
var
   i, c, sl: integer;
begin
    if l>r then begin get := 0; exit; end;
    if l=r then
    begin
        if a[l]='H' then get := 1;
        if a[l]='C' then get := 12;
        if a[l]='O' then get := 16;
        exit;
    end;
    if a[r] in ['C','H','O'] then
    begin
        get := get(l,r-1) + get(r,r);
        exit;
    end
    else if a[r] = ')' then
    begin
        c := 0;
        for i:=r downto l do
        begin
            if a[i]='(' then dec(c);
            if a[i]=')' then inc(c);
            if c=0 then
            begin
                get := get(i+1,r-1) + get(l,i-1);
                exit;
            end;
        end;
    end
    else
    begin
        sl := ord(a[r]) - ord('0');
        if a[r-1] in ['C','O','H'] then
        begin
            get := get(l,r-2) + get(r-1,r-1) * sl;
            exit;
        end;
        c := 0;
        for i:=r-1 downto l do
        begin
            if a[i]='(' then dec(c);
            if a[i]=')' then inc(c);
            if c=0 then
            begin
                get := sl * get(i+1,r-2) + get(l,i-1);
                exit;
            end;
        end;
    end;
end;

begin
    readln(a);
    n := Length(PChar(@a));
    writeln(get(0,n-1));
end.

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.