Hướng dẫn giải của Trò chơi vòng số


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='';
var n,re:byte;
    a,b:array[1..100] of shortint;
    f:array[1..100,1..100] of shortint;

procedure rf;
var i:byte; j:integer;
begin
     assign(input,fi);
     reset(input);
     readln(n);
     for i:=1 to n do
     begin
          read(j);
          if odd(j) then b[i]:=1 else b[i]:=0;
     end;
     close(input);
end;

function max(a,b:shortint):shortint;
begin
     if a>b then max:=a else max:=b;
end;

function calc(l,r:byte):shortint;
begin
     if l=r then calc:=a[l]
     else
     begin
          if f[l+1,r]=127 then f[l+1,r]:=calc(l+1,r);
          if f[l,r-1]=127 then f[l,r-1]:=calc(l,r-1);
          calc:=max(a[l]-f[l+1,r],a[r]-f[l,r-1]);
     end;
end;

procedure pr;
var i,j,k,t:shortint;
begin
     re:=0;
     for i:=1 to n do
     begin
          for j:=0 to n-1 do
          begin
               if i+j=n then t:=n else t:=(i+j) mod n;
               a[t]:=b[j+1];
          end;
          for j:=1 to n do
              for k:=j to n do
                  f[j,k]:=127;
          f[1,1]:=a[1];
          f[2,n]:=calc(2,n);
          if a[1]>f[2,n] then inc(re);
     end;
end;

procedure wf;
begin
     assign(output,fo);
     rewrite(output);
     write(re);
     close(output);
end;

begin
     rf;
     pr;
     wf;
end.

Code mẫu của RR

{$R+,Q+}
uses math;
const
  FINP='';
  FOUT='';
  MAXN=100;
var
  d:array[1..MAXN,1..MAXN] of longint;
  a,b:array[1..MAXN] of longint;
  n,kq:longint;
procedure inp;
var
  f:text;
  i:longint;
begin
  assign(f,FINP); reset(f);
  read(f,n);
  for i:=1 to n do
    begin
      read(f,b[i]);
      b[i]:=b[i] mod 2;
    end;
  close(f);
end;
procedure ans;
var
  f:text;
begin
  assign(f,FOUT); rewrite(f);
  writeln(f,kq);
  close(f);
end;
function check(u:longint):boolean;
var
  i,j,k:longint;
begin
  for i:=1 to n-1 do
    if a[i]=1 then d[i,i]:=1
    else d[i,i]:=0;
  for k:=1 to n-2 do
  for i:=1 to n-1-k do
    begin
      j:=i+k;
      d[i,j]:=max(a[i]-d[i+1,j],a[j]-d[i,j-1]);
    end;
  check:=b[u]-d[i,j]>0;
end;
procedure solve;
var
  i,j,k:longint;
begin
  kq:=0;
  for i:=1 to n do
    begin
      k:=0;
      for j:=i+1 to n do
        begin
          inc(k);
          a[k]:=b[j];
        end;
      for j:=1 to i-1 do
        begin
          inc(k);
          a[k]:=b[j];
        end;
      if check(i) then inc(kq);
    end;
end;
begin
  inp;
  solve;
  ans;
end.

Code mẫu của hieult

#include <stdio.h>
//#include <conio.h>

int max(int x,int y)
{
    if(x>y)
         return x;
    return y;
}

main()
{
      int n,a[206],le[206],f[106][206],KQ=0;
      scanf("%d",&n);
      le[0]=0;
      for(int i=1;i<=n;i++)
      {
              scanf("%d",&a[i]);
              a[i+n]=a[i];
              if(a[i]%2==0)
              {
                  le[i]=le[i-1];
                  f[i][i]=0;
              }
              else
              {
                  le[i]=le[i-1]+1;
                  f[i][i]=1;
              }
      }
      for(int i=n+1;i<=2*n;i++)
            le[i]=le[i-n]+le[n];
      for(int i=1;i<=n-2;i++)
      {
          for(int j=1;j<=n-1;j++)   
              f[j][i+j]=max(-f[j+1][i+j],-f[j][i+j-1])+le[i+j]-le[j-1];
          f[n][n+i]=max(-f[1][i],-f[n][n+i-1])+le[n+i]-le[n-1];
      }
      for(int i=1;i<=n;i++)
      {
          if(le[n]-f[i][i+n-2]>le[n]/2)
              KQ++;
      }
      printf("%d",KQ);
      //getch();
}

Code mẫu của ll931110

Program IVANA;
Uses math;
Const
  input  = '';
  output = '';
  maxn = 100;
Var
  n: integer;
  a: array[1..maxn] of integer;
  F: array[1..maxn,1..maxn,1..2] of integer;

Procedure init;
Var
  fi: text;
  i: integer;
Begin
  Assign(fi, input);
    Reset(fi);

  Readln(fi, n);
  For i:= 1 to n do
    Begin
      Read(fi, a[i]);
      If odd(a[i]) then a[i]:= 1 else a[i]:= 0;
    End;

  Close(fi);
End;

Function incc(x: integer): integer;
Begin
  inc(x);
  If x = n + 1 then exit(1) else exit(x);
End;

Function decc(x: integer): integer;
Begin
  dec(x);
  If x = 0 then exit(n) else exit(x);
End;

Procedure solve;
Var
  i,j,len: integer;
Begin
  If odd(n) then
    For i:= 1 to n do
      Begin
        F[i,i,1]:= a[i];
        F[i,i,2]:= a[i];
      End
  else
    For i:= 1 to n do
      Begin
        F[i,i,1]:= -a[i];
        F[i,i,2]:= -a[i];
      End;

  For len:= 1 to n - 1 do
    For i:= 1 to n do
      Begin
        j:= i + len;
        If j > n then j:= j - n;

        If odd(len) <> odd(n) then
          Begin
            F[i,j,1]:= max(F[incc(i),j,1] + a[i],F[i,decc(j),2] + a[j]);
            F[i,j,2]:= max(F[incc(i),j,2] + a[i],F[i,decc(j),1] + a[j]);
          End
        else
          Begin
            F[i,j,1]:= min(F[incc(i),j,1] - a[i],F[i,decc(j),2] - a[j]);
            F[i,j,2]:= min(F[incc(i),j,2] - a[i],F[i,decc(j),1] - a[j]);
          End;
      End;
End;

Procedure printresult;
Var
  fo: text;
  i,j,count: integer;
Begin
  count:= 0;
  For i:= 1 to n do
    If min(F[incc(i),decc(i),1],F[incc(i),decc(i),2]) + a[i] > 0 then inc(count);

  Assign(fo, output);
    Rewrite(fo);
    Writeln(fo, count);
  Close(fo);
End;

Begin
  init;
  solve;
  printresult;
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.