zoukankan      html  css  js  c++  java
  • 1到n的最小步数

    1到n的最小步数

     Time Limit: 1 Sec  Memory Limit: 128 MB

    给你一个数n,让你求从1到n的最小步数是多少。

    对于当前的数x有三种操作:

    1:  x+1

    2:  x-1

    3:  x*2

    Input

    测试数据为多组,对于每组测试数据:(大约1000组)

    输入一个正整数n(1 <= n <= 1000000)

    Output

    对于每组测试数据输入从1到n的最小步数ans

    Sample Input

    3
    8
    

    Sample Output

    2
    3

    这道题就是BFS模板题,但是又有点区别,测试数据组数比较多,直接写容易超时,所以要用到预处理
    #include<cstdio>
    #include<queue>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    const int maxn=1e6+100;
    int cnt[maxn*2];
    int n,t;
    
    void bfs(){
        queue<int>q;
        q.push(1);
        while(!q.empty()){
            int x=q.front(),xx;
            if(t==maxn)
                return ;
            for(int i=0;i<3;i++){    ///进行  +1  -1  *2   3种操作
                if(i==0){
                    xx=x+1;
                }
                else if(i==1){
                    xx=x-1;
                }
                else{
                    xx=x*2;
                }
                if(xx<0||xx>maxn||cnt[xx]||xx==1)  ///判断操作后是否满足条件
                    continue;
                cnt[xx]=cnt[x]+1;  ///操作数 + 1
                q.push(xx);  
                t++;         ///直接 搜索1e6次
            }
            q.pop();
        }
    }
    
    int main(){
        bfs();
        while(~scanf("%d",&n)){
            printf("%d
    ",cnt[n]);
        }
        return 0;
    }
    
    
    


  • 相关阅读:
    Shell基本语法
    CURL简单使用
    <C> 字符串简单习题
    <C> 字符串相关的函数
    <C> 内存分区
    <C> 最大值以及最大值下标 二分查找(折半查找)
    <C> 函数 函数指针
    <C> 冒泡排序及其非常非常非常简单的优化
    <C> typedef 宏 const 位运算
    <C> 数组
  • 原文地址:https://www.cnblogs.com/Y292/p/9148257.html
Copyright © 2011-2022 走看看