这是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;
}

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

B. Two Buttons的更多相关文章

  1. Android 添加ActionBar Buttons

    一.在res/menu文件夹下创建Xml文件 跟标签为menu,设置item <?xml version="1.0" encoding="utf-8"?& ...

  2. Lesson 6 Percy Buttons

    Text I have just moved to a house in Bridge Street. Yesterday a bagger knocked at my door. He asked ...

  3. BUTTONS V. 2.0.0——CSS按钮库

    BUTTONS-V2-CSS库样式职责 CSS库样式职责分离优点 模块样式命名更清晰化 易于维护.扩展性强 动画效果——修改样式后有过度效果,默认样式 源码如下 <!DOCTYPE html&g ...

  4. CodeForces 520B Two Buttons(用BFS)

     Two Buttons time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  5. Codeforces Round B. Buttons

    Manao is trying to open a rather challenging lock. The lock has n buttons on it and to open it, you ...

  6. AngularJs的UI组件ui-Bootstrap分享(七)——Buttons和Dropdown

    在ui-Bootstrap中,Buttons控件和Dropdown控件与form表单中的按钮和下拉框名字很像,但实际上这两个控件有新的含义. 先说Buttons,它是一组按钮,用来实现form表单中的 ...

  7. 使用虚拟按钮(Ghost Buttons)的25个网站

    2014年已经过去大半年了,我们看到网页设计领域出现新的设计趋势. 虚拟按钮(Ghost Buttons)是指具备基本的按钮形状的透明按钮,但有细实线的边框.有些虚拟钮是互动的,点击之后按钮可能会成为 ...

  8. MessageBox的Buttons和三级联动

    一.MessageBox的Buttons MessageBox.Show可以出现有按钮的对话框 例如: DialogResult dr = MessageBox.Show("是否要继续吗?& ...

  9. cf.295.B Two Buttons (bfs)

     Two Buttons time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  10. Java基础之处理事件——添加菜单图标(Sketcher 8 with toolbar buttons and menu icons)

    控制台程序. 要为菜单项添加图标以补充工具栏图标,只需要在创建菜单项的Action对象中添加IconImage对象,作为SMALL_ICON键的值即可. // Defines application ...

随机推荐

  1. selinue引起的ssh连接错误

    在客户端执行ssh依然报错: Permission denied (publickey,gssapi-keyex,gssapi-with-mic). 在这个页面不小心看到了原因: http://ser ...

  2. MFC中 CDateTimeCtrl 自定义日期显示格式

    MFC里的DateTimePicker控件 ,通过属性来设置的话只能设置两种显示方式,要么日期,要么时间,很多时候我们需要在一个DateTimePicker里日期和时间同时显示. 这个时候只能通过自定 ...

  3. Kali Linux信息收集工具全

    可能大部分渗透测试者都想成为网络空间的007,而我个人的目标却是成为Q先生! 看过007系列电影的朋友,应该都还记得那个戏份不多但一直都在的Q先生(由于年级太长目前已经退休).他为007发明了众多神奇 ...

  4. 通过Java的Domain类构建ElasticSearch的mapping

    通过给定一个Java的class类自行创建ElasticSearch的mapping Order的domain类 public class Order { public String system_i ...

  5. 【ActionScript】Flash与网页的交互,ActionScript与JavaScript的交互

    Flash是可以轻松与网页交互数据的,不然为何Flash会有这么大的生命力呢?仅仅是这样编程比較麻烦而已,又要调试Flash,然后又要放到server上调试. 只是这种方式可以收到非常好的效果.Fla ...

  6. 二叉查找树BST----java实现

                                                                    二叉查找树BST----java实现 1.二叉查找树简单介绍 二叉查找树 ...

  7. RMQ(区间求最值)

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A.回答若干询问RMQ(A,i,j)(i,j<=n).返回数列A ...

  8. 96Boards扩展板 STM32 B96B-F446VE 牛刀小试

    前言 原创文章,转载引用务必注明链接,水平有限,如有疏漏,欢迎指正. 本文使用Markdown写成,为获得更好的阅读体验和正常的链接.图片显示,请访问我的博客原文: http://www.cnblog ...

  9. java 中 instanceof 和 isInstance区别

    两者的功能是等价的.区别: 1.instanceof 是一个操作符(类似new, ==等): 使用方法: if (ins instanceof String) { //logic } 2.isInst ...

  10. 世纪怎么换算成具体的年份?eg:19世纪60年代=19??年?

    http://zhidao.baidu.com/question/339742625.html&__bd_tkn__=6ab5183c226b84031b08b849ecac35b396039 ...