zoukankan      html  css  js  c++  java
  • B. Two Buttons

    这是Codeforces Round #295 (Div. 2) 的B 题,题意为:

    给出n, m, 有两种操作,n 减一 和 n 乘以 2,问最少要多少次操作才能把n 变成 m。

    Sample test(s)
    input
    4 6
    
    output
    2
    
    input
    10 1
    
    output
    9
    input 是 n 和 m ,output 是次数。

    可以用BFS来做,在遍历每一层的时候,要记录一下当前的值,并且要防止同一个值被遍历两次。要是遇到当前值是目标值,那么变成当前值的次数必然是最少的。

    但是,也可以反过来做,求m变成n,有两种操作m除以2 和 m加1,求最少操作次数。要是遇到m小于n的话,m就加一,因为加一是最好的操作,要是遇到m大于n的话,这里有2种情况,如果m是偶数的话,m就除以2,否则m加1。

    这里讨论一下,为什么 m > n && m%2 == 0 时,m 要除以2(m > n 且 m 是奇数时,m不能被2整除,只能加1)

    假设:  m > n 且 m 是偶数。

    那么m 有两种情况 : ① m >= 2n ; ② 2n > m > n 。

    第①种就直接 m 除以2 了,如果m越加 1,到最后还是要除以2,这样次数会越来越多,明显没必要,直接m除以2。

    第②种的话,有两种选择: 

    A. m加1直到 m == n,操作次数是 2n-m+1(当然m加2后,还可以选择是否要除以2,但是要除以2的话,倒是没有B快)

    B. m除以2然后一直加一直到m == n,操作次数是 n-m/2+1

    来看一下哪个次数最多,把A的次数减去B的次数,得到

    n-m/2 ,因2n > m > n ,所以 n > m/2 > n/2,则 n-m/2 > 0 ,所以,B是最优的方法,也就是说,m > n && m%2 == 0 时,将m除以2。

    #include <iostream>
    using namespace std;
    
    int main(){
        int n, m, cnt = 0;
        cin >> n >> m;
        if(n >= m) {
    	    cout << n-m; return 0;
        }
        while(n != m){
    	    if(m < n) m++;
    	    else if(m % 2) m++;
    	    else m /= 2;
    	    cnt++;
        }
        cout << cnt;
        return 0;
    }
    





    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    UIWebView 本地缓存
    基于x86 Android ndk应用移植指南(android ndk 生成libs/x86)
    安装android的IntelHaxm.exe时出错的问题
    使用javah生成.h文件, 出现无法访问android.app,Activity的错误的解决
    犯傻似得的开发
    关于在win8下开发c或者c++时,某些特殊情况
    android 图片加载过多崩溃
    辞职的三十八个理由
    android程序的代码混淆打包
    几条常见的数据库建表id增长sql语句
  • 原文地址:https://www.cnblogs.com/Rex7/p/4752532.html
Copyright © 2011-2022 走看看