蚂蚱跳跃算法

小B对脑筋急转弯问题很有兴趣,她觉得这种问题的挑战能够反映一个人的应急反应能力。她正在开发一个智力测试的游戏,游戏的主角是一个蚂蚱。蚂蚱最初位于0点处,可以在直线上向正向或反向两个方向跳跃。比较特别的是,蚂蚱每次跳跃的距离比前一次跳跃多一个单位,第一次跳跃的距离为一个单位。


小B的问题是,如果让蚂蚱跳跃到x处,需要经过多少次跳跃,你能解决这个问题吗?

全部评论
int n ; while (cin >> n) { n = n > 0 ? n : 0 - n; int index = 1; int sum = 0; while (sum < n) { sum += index; index++; } if ((sum - n) % 2 == 0) { cout << index - 1 << endl; } else { if (index % 2 == 1) { cout << index << endl; } else { cout << index + 1 << endl; } } }
点赞 回复 分享
发布于 2016-09-19 17:17
只能a 17%。。不知道哪里的问题。。
点赞 回复 分享
发布于 2016-09-19 17:05
同17%,不知道怎么解决
点赞 回复 分享
发布于 2016-09-19 17:06
都是17%,我还以为就我一个...
点赞 回复 分享
发布于 2016-09-19 17:14
卧槽...我也是,我是直接放弃最后一道来攻这道的...死活想不出哪个楼了
点赞 回复 分享
发布于 2016-09-19 17:14
完全没有想法,求大神贴一下代码啊
点赞 回复 分享
发布于 2016-09-19 17:16
完全没思路,求大神贴代码
点赞 回复 分享
发布于 2016-09-19 17:17
import java.util.Scanner; public class Main { /** * 蚂蚱跳跃次数 *  * @param desPoint * @return */ public static int jumpCount(int desPoint) { int currentJumpPosition = 0;// 当前跳跃的位置 int jumpStep = 0;// 跳跃步进 int jumpCount = 0;// 跳跃次数 while (currentJumpPosition != desPoint) {// 循环,往一个方向跳跃 if (desPoint > 0) jumpStep += 1; // 正方向 else { jumpStep += -1;// 反方向 } jumpCount++; currentJumpPosition += jumpStep;// 加上步长 // 超过了 if ((desPoint > 0 && currentJumpPosition > desPoint) || (currentJumpPosition < desPoint && desPoint < 0)) { jumpCount--;// 减一 currentJumpPosition -= jumpStep;// 减去步进 jumpStep -= 1;// 减一 boolean isForward = false;// 往后 if (desPoint < 0) { isForward = true;     // 往前 } while (currentJumpPosition != desPoint) {// 来回跳跃,直到达到终点 jumpCount++; if (isForward) {// 往前跳 if (jumpStep > 0) { jumpStep = jumpStep + 1; } else { jumpStep = -jumpStep + 1; } } else { // 往后跳 if (jumpStep > 0) { jumpStep = -jumpStep - 1; } else { jumpStep = jumpStep - 1; } } isForward = !isForward;// 取反 currentJumpPosition += jumpStep;// 加上步长 } } } return jumpCount; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { int desPoint = scanner.nextInt();// 目标位置 System.out.println(jumpCount(desPoint)); } } } AC 17%
点赞 回复 分享
发布于 2016-09-19 17:17
同 17% 
点赞 回复 分享
发布于 2016-09-19 17:24
import java.util.Scanner; public class Main {     public static void main(String[] args) {         Scanner sc = new Scanner(System.in) ;         while (sc.hasNextInt()){             int x = sc.nextInt() ;             int step = 0 ;             int cur = 0 ;             int bs = 1 ;             while (cur != x){                 step++ ;                 if(cur > x ){                     if(cur-bs>=x){                         cur = cur-bs ; //向左跳                     }                     else{                         cur = cur+bs ; //向右跳                     }                 }else{                     if(cur+bs <= x){                         cur = cur+bs ; //向右跳                     }                     else                         cur = cur-bs ; //向左跳                 }                 bs++ ;             }             System.out.println(step);         }     } } 我忘记过了多少了, 但是很少,不知道该怎么改了...
点赞 回复 分享
发布于 2016-09-19 17:38
 import java.util.Scanner; public class Main{     public static void main(String[] args){         Scanner scan = new Scanner(System.in);         while(scan.hasNext()){             int x = scan.nextInt();             int temp = x;             if(x<0){                   temp = -x;             }             if(temp==0){                   System.out.println(0);                   continue;             }             int cnt =0;             int sum = 0;             while(sum<temp){                   cnt++;                   sum = sum+cnt;                                }             while((sum-temp)%2!=0){                 cnt++;                 sum = sum+cnt;             }             System.out.println(cnt);                       }     } } 
点赞 回复 分享
发布于 2016-09-19 17:39
有没有人跟我一样用动态规划子问题的规模越来越大,然后傻眼了的(´・ᆺ・`)
点赞 回复 分享
发布于 2016-09-19 17:47
function main(n){       var sum=0;       var i=0;       while(sum<n){          i++;             sum+=i;                    }       if(sum>n){       var t=sum-n;       var sum1=0;       var a=0;       while(sum1<t){       a++;       sum1+=a;       }       }else{       a=0;       }              return i+a; } 用js写的,写的好简单。。。通过率17%
点赞 回复 分享
发布于 2016-09-19 18:07
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()){ int n = sc.nextInt(); if(n==0 || Math.abs(n)==1){ System.out.println(n); return; } int location1 = -1, location2 = 1; int step = 2; n = Math.abs(n); System.out.println(Math.min(get(n,location1,step),get(n,location2,step))); } } static int get(int x, int location , int step){ while (location<x){ if(location+step>x){ location -= step; step++; }else if(location+step<x){ location += step; step++; }else { break; } } return step; } }
点赞 回复 分享
发布于 2017-08-12 20:55

相关推荐

牛舌:如果我不想去,不管对方给了多少,我一般都会说你们给得太低了。这样他们就会给下一个offer的人更高的薪资了。
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务