码迷,mamicode.com
首页 > 其他好文 > 详细

小兔蹦蹦跳【脑洞】

时间:2017-12-15 22:43:33      阅读:251      评论:0      收藏:0      [点我收藏+]

标签:family   net   cli   直线   不能   led   map   来源   最大   

题目描述

 小兔位于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
 
 
这道题出的非常好,我一点思路也没有。
先理解清楚题意,第一步和最后一步都只能跳1,且相邻跳跃次数相差不能大于1
我觉得画个草图能好理解点:
技术分享图片
技术分享图片
图上格子高度代表一次跳跃的长度,那么列格子数量就代表跳了几次,显然这样格子的总面积代表跳跃的距离。这样画的好处就是能很好看出第一步和最后一步只跳1。f(n)代表最高格子为按上图形式跳时的跳跃距离,其实还需要用到f(n)的递推式。
    即f(n)=f(n-1)+n+n-1=f(n-1)+2n-1。而且n对应的跳跃次数为2n-1。
这样或许就好理解点了,想想看,上图是最对称最完美的跳跃方式,跳跃距离还都是平方数(感觉挺神奇的)。f(n)与f(n-1)差2n-1,也就是在f(n-1)~f(n-1)+2n-1的范围内都是n-2是最大的跳跃数。用个例子说明一下:
    比如f(4)=16,f(3)=9。当距离为10时,9<10<16,易知此时“最高峰(最高的格子)“只能到3,而f(3)=9,还差1,那么好办,只需在高度为1的格子旁边再放一个高度为一的格子就能满足要求,这样也会多跳一回,所以最小跳跃次数就为(10-9)+2*3-1=6;
而当距离为15时,15-9=6>3,显然,这比“最高峰“还要大,所以一次是跳不完的,那就跳两次,也就是在高度为3的格子旁放置两个高度为3的格子。当距离再大时,最高的格子就应该为4了,问题又可以同样处理了。因此得到问题的答案:
    技术分享图片
(pos相当于上述n,len为距离)
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <map>
 4 #include <climits>
 5 #include <cstring>
 6 #include <cstdlib>
 7 #include <algorithm>
 8 #include <cmath>
 9 using namespace std;
10 typedef long long LL;
11 const int maxn=1e9+10;
12 int a[100050];
13 
14 int main()
15 {
16     a[1]=1;
17     for(int i=2;;i++){
18         if(i*i>maxn) break;
19         a[i]=i*i;
20     }
21     int s,t;
22     while(scanf("%d%d",&s,&t)==2)
23     {
24         int len=t-s;
25         int pos=1;
26         for(int i=1;;i++){
27             if(a[i]>len&&a[i-1]<=len){
28                 pos=i-1;
29                 break;
30             }
31         }
32         len-=a[pos];
33         int ans=2*pos-1;
34         if(!len) printf("%d\n",ans);
35         else if(len<=pos) printf("%d\n",ans+1);
36         else printf("%d\n",ans+2);
37     }
38     return 0;
39 }

思路来源:

http://blog.csdn.net/qq_31138083/article/details/51236696

 

小兔蹦蹦跳【脑洞】

标签:family   net   cli   直线   不能   led   map   来源   最大   

原文地址:http://www.cnblogs.com/zxhyxiao/p/8044906.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!