列表

详情


KS24. 求x到y的最少计算次数

描述

给定两个-100到100的整数x和y,对x只能进行加1,减1,乘2操作,问最少对x进行几次操作能得到y?
例如:
a=3,b=11: 可以通过3*2*2-1,3次操作得到11;
a=5,b=8:可以通过(5-1)*2,2次操作得到8;

输入描述

输入以英文逗号分隔的两个数字,数字均在32位整数范围内。

输出描述

输出一个数字

示例1

输入:

3,11

输出:

3

原站题解

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

#include <stdio.h>
#include <stdlib.h>
  
int main()
{
    int a,b;
    scanf("%d,%d",&a,&b);
    if(a>b){
        printf("%d\n",a-b);
        return 0;
    }
    int queue[300];
    int visit[200] = {0};
    int front = -1;
    int rear = -1;
    int length = 0;
    int qsize = 0;
    queue[++rear] = a;
    while(front != rear){
        length++;
        qsize = rear - front;
        while(qsize-- > 0){
            int tmp = queue[++front];
            if(tmp == b){
                printf("%d\n",length-1);
                return 0;
            }
            if(visit[tmp+100] == 0){
                visit[tmp+100] = 1;
                queue[++rear] = tmp+1;
                queue[++rear] = tmp-1;
                queue[++rear] = tmp*2;
            }
        }
    }
    return 0;
}

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

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int a,b;
    scanf("%d,%d",&a,&b);
    if(a>b){
        printf("%d\n",a-b);
        return 0;
    }
    int queue[300];
    int visit[200] = {0};
    int front = -1;
    int rear = -1;
    int length = 0;
    int qsize = 0;
    queue[++rear] = a;
    while(front != rear){
        length++;
        qsize = rear - front;
        while(qsize-- > 0){
            int tmp = queue[++front];
            if(tmp == b){
                printf("%d\n",length-1);
                return 0;
            }
            if(visit[tmp+100] == 0){
                visit[tmp+100] = 1;
                queue[++rear] = tmp+1;
                queue[++rear] = tmp-1;
                queue[++rear] = tmp*2;
            }
        }
    }
    return 0;
}

上一题