Em có đọc trên mạng thấy lời giải của bài này nhưng vẫn không hiểu tại sao lại làm như thế. Mong mọi người giúp em.

Đây là link code.

https://github.com/thewizard6296/VNOI_CODE/blob/master/NKSTEP

Dài quá =))))

Thuật của mình thì như thế này: Tính độ dài từ x->y: giả sử là len

Đặt j=trunc(sqrt(len));

Dễ thấy: Nếu j*j=len->kết quả là 2*j-1 bước

Nếu j>len-j*j>0->kết quả là 2*j bước

Cuối cùng, nếu len-j*j>j->2*j+1 bước

Trả lời cdsht
  Hiện bài gốc

Bạn có thể giải thích cho mình tại sao như thế được không?

Trả lời anhvu_cbl
  Hiện bài gốc

Haiz, thế này nha:

Xét cái đầu tiên: số bước đi 2*j-1: 

1+2+...+j+(j-1)+(j-2)+....+1=[1+2+...+j]+[(j-1)+(j-2)+....+1]=j*(j+1)/2+(j-1)*j/2=j*j->số bước đi->j+(j-1)=2*j-1

Số bước đi là 2*j: thêm một lần đi nữa trong khoảng 1->j-1 

Nếu phải đi một đoạn nữa trên j-1->phải đi thêm 2 lần->số bước là 2*j-1+2=2*j+1