列表

详情


CMB2. 小招喵跑步

描述

小招喵喜欢在数轴上跑来跑去,假设它现在站在点n处,它只会3种走法,分别是:
1.数轴上向前走一步,即n=n+1 
2.数轴上向后走一步,即n=n-1 
3.数轴上使劲跳跃到当前点的两倍,即n=2*n
现在小招喵在原点,即n=0,它想去点x处,快帮小招喵算算最快的走法需要多少步?

输入描述

小招喵想去的位置x

输出描述

小招喵最少需要的步数

示例1

输入:

3

输出:

3

原站题解

C 解法, 执行用时: 1ms, 内存消耗: 372KB, 提交时间: 2020-07-27

#include <stdio.h>
int main(void)
{
    int path,n;
    scanf("%d",&n);
    if(n<0)
        n=-n;
    for(path=0;n;path++)
    {
        if(n%2==0)
            n/=2;
        else if(n>3&&((n+1)/2)%2==0)
            n++;
        else
            n--;
    }
    printf("%d",path);
     
    return 0;
}

C 解法, 执行用时: 1ms, 内存消耗: 376KB, 提交时间: 2019-05-26

#include "stdio.h"
#define N 1024
#define MIN(x,y) ((x)<(y) ? (x):(y))
int get(int n){
    if(n<4)
        return n;
     
    if(n%2==0){
        return 1+get(n/2);
    }else{
        int a = 1+get(n+1);
        int b = 1+get(n-1);
        return MIN(a,b);
    }
}
int main(){
    int n;
    int val[N];
    while(scanf("%d", &n) != EOF){
        if(n<0) n=-n;
        printf("%d\n", get(n));
    }
     
}

C 解法, 执行用时: 1ms, 内存消耗: 380KB, 提交时间: 2018-08-31

#include "stdio.h"
#define N 1024
#define MIN(x,y) ((x)<(y) ? (x):(y))
int get(int n){
    if(n<4)
        return n;
    
    if(n%2==0){
        return 1+get(n/2);
    }else{
        int a = 1+get(n+1);
        int b = 1+get(n-1);
        return MIN(a,b);
    }
}
int main(){
    int n;
    int val[N];
    while(scanf("%d", &n) != EOF){
        if(n<0) n=-n;
        printf("%d\n", get(n));
    }
    
}

C 解法, 执行用时: 2ms, 内存消耗: 288KB, 提交时间: 2022-06-09

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
int ret(int n)
{
    if(n<0){
        return ret(-n);
    }
    if(n==0){
        return 0;
    }
    if (n == 1)
    {
        return 1;
    }
   
    if (n % 2 == 0)
    {
        return 1 + ret(n / 2);
    }
    if (n % 2 == 1)
    {
        return fmin((1 + ret(n - 1)),(2+ret((n+1)/2)));
    }
    return 0;
}
int main()
{
    int n = 0;
    scanf("%d", &n);
    printf("%d", ret(n));
    return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 308KB, 提交时间: 2020-08-05

#include <stdio.h>
int main(void)
{
    int path,n;
    scanf("%d",&n);
    if(n<0)
        n=-n;
    for(path=0;n;path++)
    {
        if(n%2==0)
            n/=2;
        else if(n>3&&((n+1)/2)%2==0)
            n++;
        else
            n--;
    }
    printf("%d",path);
      
    return 0;
}

上一题