B. Two Buttons
来源:互联网 发布:ubuntu qemu xp 编辑:程序博客网 时间:2024/05/28 22:13
这是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
可以用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;}
0 0
- B. Two Buttons
- CODEFORCES:B. Two Buttons
- B. Two Buttons
- CodeForces 520B【Two Buttons】
- Codeforces 520B. Two Buttons
- Codeforces 520B.Two Buttons
- B. Two Buttons(Codeforces Round #295(div2))
- Codeforces Round #295 B. Two Buttons
- Codeforces 520B. Two Buttons spfa
- Codeforces 520 B Two Buttons BFS
- Codeforces 520B Two Buttons 【BFS】||【spfa】
- Codeforces 295 Div2 B.Two Buttons
- codeforces 520B Two Buttons BFS
- cf 520 B. Two Buttons bfs
- Codeforces 520B Two Buttons 题解
- CodeForces 520 B.Two Buttons(bfs)
- Two Buttons
- Two Buttons
- 博客测试
- JNI/NDK开发指南(开山篇)
- JAVA NIO之浅谈内存映射文件原理与DirectMemory
- 页面去除session
- 图解web前端开发工具教程
- B. Two Buttons
- 解析==Android设备完整开发流程图
- leetcode_num20_Valid Parentheses
- 编译链接报undefined reference to error
- 三种格式文件比较 .properties .conf .json
- Deep Learning学习笔记(一):卷积神经网络(CNN)
- asp中isNull、isEmpty和空字符串的区别
- XML解析类NSXMLParser
- 运行软件不是中文