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