【C++贪心 数论】991. 坏了的计算器|1909

本文涉及知识点

C++贪心

数论:质数、最大公约数、菲蜀定理

LeetCode991. 坏了的计算器

在显示着数字 startValue 的坏计算器上,我们可以执行以下两种操作:

双倍(Double):将显示屏上的数字乘 2;

递减(Decrement):将显示屏上的数字减 1 。

给定两个整数 startValue 和 target 。返回显示数字 target 所需的最小操作数。

示例 1:

输入:startValue = 2, target = 3

输出:2

解释:先进行双倍运算,然后再进行递减运算 {2 -> 4 -> 3}.

示例 2:

输入:startValue = 5, target = 8

输出:2

解释:先递减,再双倍 {5 -> 4 -> 8}.

示例 3:

输入:startValue = 3, target = 10

输出:3

解释:先双倍,然后递减,再双倍 {3 -> 6 -> 5 -> 10}.

提示:

1 <= startValue, target <= 10^9^

贪心 数量

情况一:start 等于target。直接返回0。

情况二:start > target。

令最近解为start 、i1 ⋯ \cdots ⋯ i2 target。
性质一 :target 只会出现一次,且在最后,否则提前结束。
性质二 :不会有数小于target。 假设i2是第一个小于target的数,它的前一个数是i1。由于i1 > target ,故i1-1 >= target,与假设矛盾;

i12 > target 2 >= target,也与假设矛盾。
性质三 :不会出现乘以2。令最后一个乘法是i1乘以2是i2。根据性质一性质二,i1> target。i1减到target比i1*2减少到target需要的次数少得多。

总结:返回 start - target。

情况三:start < target

令start 最少乘以2 m次后,大于等于target。令 x = start × \times × 2^m^- target

如果x的第0位(最低位)是1,乘2 m次后,减1。

如果x的第1位 是1,乘2 m-1次后,减1。

即:x 0到m-1位的1,可以一次减掉。其它的乘2之前,一次可以减少 2^m^。

代码

核心代码

cpp 复制代码
class Solution {
		public:
			int brokenCalc(int startValue, int target) {
				if (startValue > target) { return startValue- target; }
				int m = 0;
				for (; startValue < target; startValue*=2, m++);
				int x = startValue - target;
				int ans = 0;
				for (int i = 0; i < m; i++) {
					if ((1 << i) & x) {
						x -= (1 << i);
						ans++;
					}
				}
				return m+ ans + x / (1 << m);
			}
		};

单元测试

cpp 复制代码
int startValue,  target;
		TEST_METHOD(TestMethod11)
		{
			startValue = 2, target = 3;
			auto res = Solution().brokenCalc(startValue, target);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod12)
		{
			startValue = 5, target = 8;
			auto res = Solution().brokenCalc(startValue, target);
			AssertEx(2, res);
		}
		TEST_METHOD(TestMethod13)
		{
			startValue = 3, target = 10;
			auto res = Solution().brokenCalc(startValue, target);
			AssertEx(3, res);
		}
		TEST_METHOD(TestMethod14)
		{
			startValue = 3, target = 3;
			auto res = Solution().brokenCalc(startValue, target);
			AssertEx(0, res);
		}
		TEST_METHOD(TestMethod15)
		{
			startValue = 13, target = 3;
			auto res = Solution().brokenCalc(startValue, target);
			AssertEx(10, res);
		}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17

或者 操作系统:win10 开发环境: VS2022 C++17

如无特殊说明,本算法用**C++**实现。

相关推荐
winds~2 分钟前
c++类模板成员函数的特化
java·开发语言·c++
laufing11 分钟前
OD E卷 - 实现【流浪地球】
python·算法·逻辑模拟
pursuit_csdn13 分钟前
力扣 48. 旋转图像
数据结构·算法·leetcode·矩阵·力扣
萨达大32 分钟前
23种设计模式-单例(Singleton)设计模式
java·c++·单例模式·设计模式·软考·创建型设计模式·软件设计师
ll92311635 分钟前
C++和C中的volatile 关键字
c语言·c++
zaim142 分钟前
计算机的错误计算(一百六十八)
java·c++·python·matlab·rust·c#·大数
Reeeeeeeeeee-43 分钟前
[MRCTF2020]Transform
c语言·开发语言·汇编·c++·算法
萨达大1 小时前
23种设计模式-装饰器(Decorator)设计模式
java·c++·设计模式·软考·装饰器模式·软件设计师·结构型设计模式
秋落风声1 小时前
【二维动态规划:交错字符串】
算法·leetcode·动态规划
Koishi_TvT1 小时前
蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)
c++·学习·算法·蓝桥杯·深度优先·动态规划·c