zoukankan      html  css  js  c++  java
  • CF 520 B. Two Buttons(bfs)

    /*题意:一个数,就是输入的第一个数,让它变成第二个数最少用几步。可以点红色按钮,蓝色按钮来改变数字,红色:*2,蓝色:-1,如果变成负数,
    就变成原来的数。
    CF 520 B. Two Buttons
    思路:当然是*2可以掠过的步数更少啦,如果n是输入,m是输出。

    如果n大于m,不能使用红色按钮,很容易看出,步数就是n-m。

    如果n比m小,如果m是偶数的话,m/2,如果m是奇数,m+1,这样一直循环判断n是不是还比m小,不符合就跳出循环,进入第一个如果。*/

    /*正向BFS
    #include<iostream>
    #include<queue>
    #include<string.h>
    #define ll long long
    using namespace std;
    ll n, m, cnt;
    ll vis[20000005], ans[20000005];
    queue<ll>a;
    int main()
    {
        while (cin >> n >> m)
        {
            memset(vis, 0, sizeof(vis));
            memset(ans, 0, sizeof(vis));
            while(!a.empty())
                a.pop();
            cnt = 0;
            if (n >= m)
                cout << n - m << endl;
            else
            {
                a.push(n);
                while (!a.empty())
                {
                    ll x = a.front();
                    a.pop();
                    if (x == m)
                    {
                        cnt = ans[x];
                        break;
                    }
    
                    if (x <= 2*m && x - 1 >= 0 && vis[x] == 0)
                    {
                        a.push(x - 1);
                        ans[x - 1] = ans[x] + 1;
                    }
                    if (x <= 2*m  && x != 0 && vis[x] == 0)
                    {
                        a.push(x * 2);
                        ans[x * 2] = ans[x] + 1;
                    }
                    vis[x] = 1;
                }
                cout << cnt << endl;
            }
            
    
        }
        return 0;
    }
    */
    
    
    //逆向规律模拟
     #include<iostream>
     #include<algorithm>
     #include<string.h>
     #include<math.h>
     #define ll long long
     using namespace std;
     ll a, b, ans;
     int main()
     {
         while (cin >> a >> b)
         {
             ans = 0;
             if (a >= b)
                 ans = a - b;
             else
             {
                while (a < b)
                 {
                     if (b % 2)
                     {
                         ans++;
                         b++;
                     }
                     else
                     {
                         ans++;
                         b /= 2;
                     }
                 }
                 ans += abs(a - b);
             }
             cout << ans << endl;
         }
         return 0;
     }
  • 相关阅读:
    君のことが好きだよ。
    [拓展Bsgs] Clever
    同余方程笔记
    [HAOI2008] 糖果传递
    [USACO10DEC] Treasure Chest
    [APIO2007] 风铃
    Luogu_2015 二叉苹果树
    关于高精度
    关于博弈论
    关于DP和背包
  • 原文地址:https://www.cnblogs.com/-citywall123/p/9511743.html
Copyright © 2011-2022 走看看