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
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
Bạn có thể giải thích cho mình tại sao như thế được không?
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