湖科大校赛第三题
题目描述
小兔位于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); } }