Hướng dẫn giải của MAJMUN


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 RR

{$R+,Q+}
uses math;
const
  so:array['0'..'7'] of longint=(0,1,2,3,4,5,6,7);
const
  FINP='';
  FOUT='';
  MAXN=100001;
var
  f1,f2:text;
  n:longint;
  kq:double;
  xb,yb,xm,ym:double;
  a:array[0..MAXN] of longint;
  left,right:array[0..MAXN,0..7] of longint;
  now:array[0..7] of longint;
procedure openF; inline;
begin
  assign(f1,FINP); reset(f1);
  assign(f2,FOUT); rewrite(f2);
end;
procedure closeF; inline;
begin
  close(f1); close(f2);
end;
procedure inp; inline;
var
  i,x:longint;
  ch:char;
begin
  readln(f1,xm,ym,xb,yb);
  readln(f1,n);
  for i:=1 to n do
    begin
      read(f1,ch);
      x:=so[ch];
      a[i]:=(a[i-1]+x) mod 8;
    end;
end;
function dist(x1,y1,x2,y2:double):double; inline;
begin
  dist:=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
procedure solve;
var
  i,c,cc:longint;
  xx,yy:double;
begin
  //Tinh vi tri hien tai cua khi, cap nhat cho ket qua
  fillchar(now,sizeof(now),0);
  for i:=1 to n do inc(now[a[i]]);
  xx:=xm-(now[1]-now[5]+now[3]-now[7])-(now[2]-now[6]);
  yy:=ym+(now[0]-now[4])+(now[1]-now[5]-now[3]+now[7]);
  kq:=dist(xx,yy,xb,yb);
  //Tinh mang left
  for i:=1 to n do
    begin
      left[i]:=left[i-1];
      inc(left[i,a[i]]);
    end;
  //Tinh mang right
  for i:=n downto 1 do
    begin
      right[i]:=right[i+1];
      inc(right[i,a[i]]);
    end;
  //Duyet vi tri thay the
  for i:=1 to n do
    for c:=1 to 7 do
      begin
        if (i=4) and (c=7) then
          begin
            write('');
          end;
        //Tinh so luot di chuyen theo moi huong
        for cc:=0 to 7 do now[cc]:=left[i-1,cc];
        for cc:=0 to 7 do inc(now[(cc+c) mod 8],right[i,cc]);
        //Tinh vi tri cua khi neu quay phim a[i] di c lan
        xx:=xm-(now[1]-now[5]+now[3]-now[7])-(now[2]-now[6]);
        yy:=ym+(now[0]-now[4])+(now[1]-now[5]-now[3]+now[7]);
        //Cap nhat lai ket qua
        kq:=min(dist(xx,yy,xb,yb),kq);
      end;
end;
procedure ans; inline;
begin
  writeln(f2,kq:0:10);
end;
begin
  openF;
  inp;
  solve;
  ans;
  closeF;
end.

Code mẫu của hieult

#include <cstdio>
//#include <conio.h>
#include <cmath>
#include <cstring>
#include <iostream>

class diem
{
     public:
     int x,y;
     diem(){};
     diem(int u,int v){ x = u;y=v;}

};


double kc(diem A,diem B)
{
      return sqrt(((long long)(A.x)-B.x)*((long long)A.x-B.x)+((long long)A.y-B.y)*(A.y-(long long)B.y));
}

    int a,b,X,Y,h[100010],f[9][100010],n,g[9];
    char s[100010];
    diem d[100010],finish,moi;
    double kq;

double min(double a,double b)
{
       if(a<b) return a;
       return b;
}

int main()
{
   // freopen("majmun.in.10","r",stdin);
    scanf("%d %d %d %d",&a,&b,&X,&Y);
    X = X-a;
    Y = Y-b;
    finish = diem(X,Y);
    scanf("%d %s",&n,s);
    h[0] = 0;
    d[0].x = 0; d[0].y = 0;
    for(int i = 1;i<=n;i++)
    {
        h[i] = (h[i-1]-s[i-1]+48);
        if(h[i]<0) h[i] += 8;
        if(h[i]>=1 && h[i]<=3) d[i].x = d[i-1].x+1;
        else if(h[i]>=5 && h[i]<=7) d[i].x = d[i-1].x-1;
        else d[i].x = d[i-1].x;
        if(h[i]==0 || h[i]==1 ||h[i] == 7) d[i].y = d[i-1].y+1 ;
        else if(h[i]>=3 && h[i]<=5) d[i].y = d[i-1].y-1;
        else d[i].y = d[i-1].y;
        //printf("%d %d %d\n",h[i],d[i].x,d[i].y);
    }

    kq = kc(d[n],finish);
    //printf("%d %d\n",d[n].x,d[n].y);
    for(int i = 0;i<=7;i++)
         f[i][n+1]=0;
    for(int i = n;i>=1;i--)
    {
         for(int j = 0;j<=7;j++)
         f[j][i] = f[j][i+1];
         f[h[i]][i] = f[h[i]][i+1]+1;
    }
    for(int i = 1;i<=n;i++)
    {
         for(int j = 1;j<=7;j++)
         {
              memset(g,0,sizeof(g));

              for(int k = 0;k<=7;k++)
                  g[k] = f[(k+j)%8][i];
              moi =  diem(d[i-1].x+g[1]+g[2]+g[3]-g[5]-g[6]-g[7],d[i-1].y+g[7]+g[0]+g[1]-g[3]-g[4]-g[5]);
              kq = min(kq,kc(moi,finish));
         }
    }
    printf("%lf",kq);
  // getch();

}

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.