Hướng dẫn giải của Chuyển
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 flashmt
var i,x,y,t,n,k:longint; begin readln(t); for i:=1 to t do begin readln(x,y); n:=abs(y-x); k:=trunc(sqrt(n)); while k*(k+1)<n do inc(k); dec(k); if n-k*(k+1)>k+1 then writeln(k*2+2) else writeln(k*2+1); end; end.
Code mẫu của happyboy99x
#include <cstdio> /* Goi a[i] la k/c co the di chuyen bang i buoc di a[0] = 0; a[i] = a[i-1] + ( i + 1 ) / 2 */ int main() { int te; int m, n; int dis; //distance int steps; scanf( "%d", &te ); for ( int t = 0; t < te; ++t ) { scanf( "%d %d", &m, &n ); dis = n > m ? n - m : (m-n); int len = 0, i = 0; steps = 0; while ( len < dis ) { len += ( i + 1 ) / 2; ++i; ++steps; } if ( dis != 0 ) --steps; printf( "%d\n", steps ); } }
Code mẫu của ladpro98
program nkstep; uses math; const maxsqrt=46340; fi=''; var A:ARRAY[1..maxsqrt] of longint; inp:text; n,x,y,res:longint; procedure init; var i:longint; begin for i:=1 to maxsqrt do a[i]:=sqr(i); end; function find(key:longint):longint; var l,r,m,k:longint; begin l:=1; r:=maxsqrt; while l<=r do begin m:=(l+r) shr 1; if a[m]<=key then begin k:=m; l:=m+1; end else r:=m-1; end; exit(k); end; procedure open; begin assign(inp,fi); reset(inp); end; procedure process; var t,p,pos:longint; begin readln(inp,t); for p:=1 to t do begin readln(inp,x,y); n:=abs(x-y); pos:=find(n); res:=(pos shl 1-1)+((n-a[pos]) div pos); if (n-a[pos]) mod pos>0 then inc(res); writeln(res); end; close(inp); end; begin open; init; process; end.
Code mẫu của RR
{$R+,Q+} {$Mode objFPC} uses math; const FINP=''; FOUT=''; oo=50001; var f1,f2:text; x,y,i,test,kq,dist:longint; procedure openF; begin assign(f1,FINP); reset(f1); assign(f2,FOUT); rewrite(f2); end; procedure closeF; begin close(f1); close(f2); end; function find:longint; var l,r,mid,kq:longint; begin l:=1; r:=oo; kq:=0; repeat mid:=(l+r)>>1; if sqr(mid)<=dist then begin kq:=mid; l:=mid+1; end else r:=mid-1; until l>r; exit(kq); end; procedure solve; var x,i:longint; begin x:=find; dist-=sqr(x); kq:=x<<1-1; i:=x; while dist>0 do begin if dist>=i then begin dist-=i; kq+=1; end else dec(i); end; end; begin openF; read(f1,test); for test:=1 to test do begin read(f1,x,y); if x=y then begin writeln(f2,0); continue; end; dist:=abs(x-y); solve; writeln(f2,kq); end; closeF; end.
Code mẫu của hieult
#include <stdio.h> #include <math.h> main() { long n,A[200000],a,b,m; scanf("%ld",&n); for(int i=0;i<n;i++) { scanf("%ld %ld",&a,&b); if(a-b>0) A[i]=a-b; else A[i]=b-a; } for(int i=0;i<n;i++) { m=sqrt(A[i]-1)+1; printf("%ld\n",2*m-1-(m*m-A[i])/m); } }
Code mẫu của khuc_tuan
import math def process(n): if n==0: print 1000 return i = int(math.sqrt(n)) s = i * (i+1) / 2 r = 1000000000 while s+s-i<=n: h = n - s - s + i t = 2 * i - 1 if (h%i)==0: t += h / i else: t += h / i + 1 r = min( r, t) i += 1 s += i print r st = input() for i in range(st): [x,y] = [int(k) for k in raw_input().split(" ")] process(abs(y-x))
Bình luận