题目描述
小兔位于X轴的x点,欲跳至X轴的y点。x,y均为整数。小兔每次沿x轴直线跳跃,每跳的长度均为正整数,假设
小兔一共跳了n次才到目的地,每次跳的长度为F1,F2,..., Fn. 有规则如下:
F1=Fn=1
|Fi-Fi-1|<=1 , 2<=i<=n (注:| |是绝对值符号)
我们的问题是给定x,y, 如何使得n最小。
输入
包含多组数据,但不超过1000组。每组数据一行,每行包括两个整数x和y。0 <= x < y <= 1000000000 。
输出
对于每一组数据,输出一行,即从x到y的最小跳跃次数n。
样例输入
45 4845 4945 50
样例输出
334
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int a[100010];
const int inf=1000000000;
int main()
{
int res=0;
a[1]=1;
for(int i=2;; i++)
{
a[i]=a[i-1]+2*i-1;//算最大峰且元素不重复的和,后一个比前一个多一个i多一个i-1
//cout<<a[i]<<endl;
if(a[i]>=inf)break;
}
int j;
int s,t;
while(scanf("%d%d",&s,&t)!=EOF)
{
int tmp=t-s;
for(j=1;; j++)
{
if(a[j]>tmp&&a[j-1]<=tmp)break;
}
j--;//找出最大峰
tmp-=a[j];
res=2*j-1;
if(tmp==0)res=res;
else if(tmp<=j)res++;//这样可以在tmp出多用一次
else res+=2;//否则只能加二,当然不可能加三,否则肯定多余两倍最大值,这是最大峰肯定会改变
printf("%d\n",res);
}
}