Delta-wave
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4602 Accepted Submission(s): 1745
Problem Description
A triangle field is numbered with successive integers in the way shown on the picture below.
The traveller needs to go from the cell with number M to the cell with number N. The traveller is able to enter the cell through cell edges only, he can not travel from cell to cell through vertices. The number of edges the traveller passes makes the length of the traveller's route.
Write the program to determine the length of the shortest route connecting cells with numbers N and M.
The traveller needs to go from the cell with number M to the cell with number N. The traveller is able to enter the cell through cell edges only, he can not travel from cell to cell through vertices. The number of edges the traveller passes makes the length of the traveller's route.
Write the program to determine the length of the shortest route connecting cells with numbers N and M.
Input
Input contains two integer numbers M and N in the range from 1 to 1000000000 separated with space(s).
Output
Output should contain the length of the shortest route.
Sample Input
6 12
Sample Output
3
Source
Recommend
lcy
这个题目是找规律的数学题,每个数都可以由三个数来表示它的坐标,竖直高度ha,斜左高度la,斜右高度ra,
比如说6 12 吧 6 的ha,la,ra为3 ,2, 1,12的ha,la,ra为5 3 2 ,5-3+3-2+2-1=3 可得为3了
#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
int main()
{
int i,j,k,n,m,tem;
while(scanf("%d%d",&m,&n)!=EOF)
{
if(m>n)
{
tem=m;
m=n;
n=tem;
}
int ha=(int)ceil(sqrt((double)m));
int hb=(int)ceil(sqrt((double)n));
int la=(m-((ha-1)*(ha-1)+1))/2+1;
int lb=(n-((hb-1)*(hb-1)+1))/2+1;
int ra=(ha*ha-m)/2+1;
int rb=(hb*hb-n)/2+1;
// printf("%d\n",(int)hb-ha+lb-la+rb-ra);
/*
这个地方我错了好多遍,后来我看别人做的才明白一点就是
虽然交换了数,但是对于左右大小来说却不是一定就是数大
的就大的啦。
*/
int ans=(int)(fabs(la-lb)+fabs(ha-hb)+fabs(ra-rb));
printf("%d\n",ans);
}
return 0;
}