玛艾露贝莉·赫恩
题目描述
输入
第一行,包含两个整数 X 和 Y,表示起点和终点的标号。
输出
一行,包含一个数,表示两个区域之间的距离。
样例输入
19 30
样例输出
5
提示
保证 X; Y <= 10000。
#include<bits/stdc++.h> using namespace std; const int N=10001; int n,m,x,y,a[N]; int qx,qy,hx,hy,fx,fy,dx,dy; int q(int x) { int s=1; for(int i=0;i<x;i++) { s+=6*i; if(s>=x) return i; } } int h(int x,int k) { if(x>=a[k]-k) return k; else if(x>=a[k]-3*k) return k-(a[k]-k-x); else if(x>=a[k]-4*k) return -k; else return -k+a[k]-k*4-x; } int f(int x,int k) { if(x>=a[k]-k) return k-(a[k]-x)*2; else if(x>=a[k]-2*k) return -k-(a[k]-k-x); else if(x>=a[k]-3*k) return -k*2+(a[k]-k*2-x); else if(x>=a[k]-4*k) return -k+(a[k]-k*3-x)*2; else if(x>=a[k]-5*k) return k+(a[k]-k*4-x); else return k*2-(a[k]-k*5-x); } int main() { scanf("%d%d",&x,&y); a[0]=1; for(int i=1;a[i-1]<N;i++) a[i]=a[i-1]+6*i; qx=q(x),qy=q(y); hx=h(x,qx),hy=h(y,qy); fx=f(x,qx),fy=f(y,qy); dx=abs(hx-hy),dy=abs(fx-fy); if(dx>=dy) printf("%d",dx); else { m=dx,dy-=dx; printf("%d",m+(dy+1)/2); } return 0; }