Hướng dẫn giải của Kiểm tra chương trình


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 fi='';
      fo='';
      maxn=50000;
var n,re,v:longint;
    a,d:array[0..maxn] of longint;

procedure rf;
var s:string; l:longint;
begin
     n:=0; d[0]:=0;
     readln(s); l:=length(s);
     while l<7 do
     begin
          if l>1 then
          begin
               inc(n);
               a[n]:=l shr 1;
               d[n]:=d[n-1];
               if odd(a[n]) then d[n]:=d[n]+2-a[n];
          end;
          readln(s);
          l:=length(s);
     end;
end;

function calc(l,r:longint;var u:longint):longint;
var k,i,j,re,t,v:longint;
begin
     u:=0;
     if l+1>=r then
     begin
          calc:=1;
          if (a[l]=1) and (a[r]=3) then u:=0 else u:=1;
          exit;
     end;
     for k:=l+1 to r-1 do
         if (a[k]=2) and (d[k]=d[l]) then
         begin
              calc:=calc(l,k,v)+calc(k,r,v);
              u:=1;
              exit;
         end;
     re:=1; i:=l+1;
     while i<r do
     begin
          for j:=i+1 to r-1 do
              if (a[j]=3) and (d[j]=d[i]-1) then break;
          t:=calc(i,j,v);
          re:=re*(t+1-v);
          i:=j+1;
     end;
     calc:=re;
end;

procedure wf;
var re,i,j,t,z:longint;
begin
     i:=1; re:=1;
     while i<n do
     begin
          for j:=i+1 to n do
              if (a[j]=3) and (d[j]=d[i]-1) then break;
          t:=calc(i,j,z);
          re:=re*(t+1-z);
          i:=j+1;
     end;
     writeln(re);
end;

begin
     assign(input,fi); reset(input);
     assign(output,fo); rewrite(output);
     rf;
     wf;
     close(input); close(output);
end.

Code mẫu của RR

{$R+,Q+}
PROGRAM NKTEST;
CONST
  FINP='';
  FOUT='';
  max=50000;
VAR
  kq:longint;
  count:array[0..max,1..2] of longint;
  n:array[0..max] of byte;
  ok:array[1..max] of boolean;
procedure writeOutput;
var
  f:text;
begin
  assign(f,FOUT); rewrite(f);
  writeln(f,count[0,1]);
  close(f);
end;
procedure readInput;
var
  f:text;
  s:string;
  level:longint;
begin
  kq:=1;
  assign(f,FINP); reset(f); level:=0;
  count[0,1]:=1; n[0]:=1;
  repeat
    readln(f,s);
    if s='IF' then
      begin
        inc(level); n[level]:=1;
        ok[level]:=false;
        count[level,1]:=1;
        count[level,2]:=1;
      end
    else if s='ELSE' then
      begin
        inc(n[level]);
      end
    else if s='END_IF' then
      begin
        dec(level);
        count[level,n[level]]:=count[level,n[level]]*(count[level+1,1]+count[level+1,2]);
      end;
  until s='ENDPROGRAM';
  close(f);
end;
BEGIN
  readInput;
  writeOutput;
END.

Code mẫu của skyvn97

#include<cstdio>
#include<iostream>
#include<string>
using namespace std;
typedef long long ll;
inline string nextstring(void) {
    string s;
    cin>>s;
    return s;
}
ll steps(const string &END="END_IF") {
    ll bef=1;
    ll aft=1;
    bool ELSE=false;
    while (true) {
        string s=nextstring();
        if (s=="S") continue;
        if (s==END) return (bef+aft-(END!="END_IF"));
        if (s=="ELSE") ELSE=true;
        if (s=="IF") {
            if (ELSE) aft*=steps();
            else bef*=steps();
        }
    }
}
int main(void) {
    ios::sync_with_stdio(false);
    cout<<steps("ENDPROGRAM");
    return 0;
}

Code mẫu của khuc_tuan

#include <iostream>
using namespace std;

int a[1000000];
int n;

int calc(int l, int r) {
    if(l>r) return 1;
    int dem = 0, el = -1, en = -1;
    for(int i=l;i<=r;++i) {
        if(a[i]==1) ++dem;
        else if(a[i]==3) --dem;
        if(dem==1 && a[i]==2)
            el = i;
        if(dem==0 && a[i]==3) {
            en = i;
            break;
        }
    }
    int res = calc( en+1, r);
    int dau = 0;
    if(el==-1) dau += 1 + calc(l+1, en-1);
    else dau += calc(l+1, el-1) + calc(el+1,en-1);
    return res * dau;
}

int main() {
    char buf[100];
    while(gets(buf)) {
        if(strcmp(buf,"ENDPROGRAM")==0) break;
        else if(strcmp(buf,"IF")==0) a[n++] = 1;
        else if(strcmp(buf,"ELSE")==0) a[n++] = 2;
        else if(strcmp(buf,"END_IF")==0) a[n++] = 3;
    }
    // for(int i=0;i<n;++i) cout << a[i] << " " ; cout << endl;
    int res = calc(0,n-1);
    cout << res << endl;
    // system("pause");
    return 0;
}

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.