最少砝码问题(用一部分数的和/差表示区间上所有的整数)

2023-11-03

问题1, 需要表示[1, N] 的所有重量,最少需要多少砝码?

答案:需要 1,2, 4,  ... , ceiling(logN),每个砝码代表二进制数的一位,N有ceiling(logN)个二进制位。


问题2, 需要表示[1, N] 的所有重量,手头已有一些砝码,问:怎样添加新的砝码,使得需要添加的砝码数最少?

不变式:curMax为当前可以表示的重量的最大值,也就是[1, curMax] 都可以表示,

算法:从小到大考察已有砝码x,如果x > curMax + 1,则需要把curMax + 1加进去,因为这个值现有的砝码怎么组合都无法表示。然后维护curMax,即加进一个新砝码后,可以表示的新的连续重量最大值。如果x <= curMax + 1, 则curMax 和 x之间没有gap, 只需要维护新的curMax。 循环结束后,如果curMax < N,则需要加进curMax + 1, 更新curMax,如此反复。

vector<int> neededNumber(vector<int> &A, int n) {
	sort(begin(A), end(A));
	int curMax = 0;
	vector<int> ans;
	for (int x : A) {
		while (curMax < n && x > curMax + 1) {
			ans.push_back(curMax + 1);
			curMax += curMax + 1;
		}
		if (curMax == n) return ans;
		curMax += x;
	}
	while (curMax < n) {
		ans.push_back(curMax + 1);
		curMax += curMax + 1;
	}
	return ans;
}


问题3:需要表示[1, N]的所有重量,需要多少砝码?天平两侧都可以放砝码。(即现有砝码的差也可以用来表示重量)

数学归纳:curMax是当前可表示的最大,即[1, curMax]都可以表示,下一砝码的值nextValue用贪心的思想希望它尽可能大,但是要保证[curMax + 1,  nextValue - 1] ]都能被表示,不能有洞,而这个区间的值只能用减法表示 即[nextValue -  curMax,  nextValue - 1],   nextValue - curMax = curMax + 1, nextValue = 2 * curMax + 1。

或者这么理解,每个数都有3种状态1(放左边),0不放,-1(放右边)和题1类似的理解


问题4:同问题3,但是已经有了一些砝码,然后添加新的砝码,怎样最少添加多少个?




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最少砝码问题(用一部分数的和/差表示区间上所有的整数) 的相关文章

随机推荐

  • MATLAB2016b 下载,破解,安装

    MATLAB2016下载地址 包含安装教程 链接 https pan baidu com s 1gvYOii0Db5tHMV3blSb w 密码 zq6i 解压破解文件夹密码 rjzkgzh MATLAB C盘的安装路径 C Program
  • C语言-快速排序算法-原理-详解(完整代码)

    目录 原理 思想 代码 快排代码详解 执行结果 原理 先选择一个数作为 基准值 这里用的是 第一个数 进行一次排序 然后将所有比 基准值小的数 放在基准值的 左边 将所有比 基准值大的数 放在基准值的 右边 然后再对两边的 各自 再取一个数
  • Git基本概念及常用命令

    一 基本概念 1 1 概念 Git是一个开源的分布式版本控制系统 在项目开发过程中 我们可以用它记录我们对项目的操作记录以及项目迭代过程 git有两种类型的仓库 分别是本地仓库和远程仓库 本地仓库 是在开发人员自己电脑上的Git仓库 远程仓
  • 搭建zimg内网图片服务器+springboot+Java对接

    简述 zimg是图像存储和处理服务器 您可以使用URL参数从zimg获取压缩和缩放的图像 zimg的并发I O 分布式存储和时间处理能力非常出色 您不再需要在图像服务器中使用nginx 在基准测试中 zimg可以在高并发级别上处理每秒300
  • 对话框拦截控件消息

    BOOL CQuickMosaicDlg PreTranslateMessage MSG pMsg if pMsg gt message WM KEYDOWN 键盘按下 if pMsg gt hwnd GetDlgItem IDC DATA
  • 结构型设计模式之装饰器模式【设计模式系列】

    系列文章目录 C 技能系列 Linux通信架构系列 C 高性能优化编程系列 深入理解软件架构设计系列 高级C 并发线程编程 设计模式系列 期待你的关注哦 现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everythin
  • 有手就会做!保姆级Jmeter分布式压测操作流程(图文并茂)

    分布式压测原理 分布式压测操作 保证本机和执行机的JDK和Jmeter版本一致 配置Jmeter环境变量 配置Jmeter配置文件 上传每个执行机服务jmeter chmod R 755 apache jmeter 5 1 1 执行机配置写
  • rk3399pro移植安装opencv源码编译包问题记录

    之前在3399pro开发板上编译了opencv4 5 1的源码 将编译后的文件导出 在新的开发板上进行移植安装 本文记录了移植安装过程中出现的问题及解决方法 2021 05 18更新 1 环境配置 在移植安装之前配置新板子的开发环境 参考博
  • centos5 下安装oracle10g

    环境 CentOS release 5 Final 1 创建用户 没啥说的 照着官方文档的思路做就行了 groupadd oinstall 创建组用户 groupadd dba 创建组用户 useradd g oinstall G dba
  • 融云:AI 机器人在社交软件中的花样存在

    最近 AIGC 行业的新话题来自 HeyGen 的一段自动生成视频 关注 融云全球互联网通信云 了解更多 一眼看上去 真 到吓人 手势 嘴型等细节逼近真人效果 除了 眨眼的频率有点高 图源 HeyGen 这是 AI 数字人公司 HeyGen
  • Ext combobox 动态模糊匹配

    var gfxmComb new Ext form ComboBox id gfxmComb store gfxmStore typeAhead true mode local editable true displayField xmMc
  • vtk python3环境安装配置

    vtk python3环境安装配置 安装miniconda 下载地址 https docs conda io en latest miniconda html https docs conda io en latest miniconda
  • 2019年金秋第五周助教小结

    总结 经观察本周作业完成情况 有一部分同学对于第二题的要求有所误解 题目的加密是要求将每个字符向后移动三个位置 而大部分人理解成了将每个字符的ASCll码值加三个单位 因为本周的作业相较容易 除了对题目的理解有问题之外 大部分同学都能写的出
  • UDP协议的简单概述

    1 UDP协议概述 UDP是User Datagram Protocol 用户数据协议 的简称 是一种无连接的协议 该协议工作在OSI模型中的第四层 传输层 处于IP协议的上一层 传输层的功能就是建立 端口到端口 的通信 UDP提供面向事务
  • C语言入门-王道考研

    1 1 C语言结构
  • 七牛云图片上传

    七牛云图片上传 进入七牛云官网 注册 登录找到对象存储 新建存储空间 进入个人中心 找到秘钥管理获取AK和SK 代码 pox xml导入依赖
  • pyecharts 画折线图去掉折线上小圆圈

    如果想删除上图标记出来的小圆圈 变为如下形式 只需在代码中加入 is symbol show False 即可 line add country date column dict country line width 3 is symbol
  • 数据库设计(真题讲解)-软件设计(三十四)

    系统开发 McCabe复杂度 下 软件设计 三十三 https blog csdn net ke1ying article details 129719533 spm 1001 2014 3001 5501 ER模型 1对1 1对多 多对多
  • matlab相关性分析频谱_利用Matlab绘制正弦信号的频谱图并做相关分析范文

    专业知识整理分享 利用 Matlab 绘制正弦信号的频谱图并做相关分析 一 作业要求 1 信号可变 信号的赋值 相位 频率可变 2 采样频率 fs 可变 3 加各种不同的窗函数并分析其影响 4 频谱校正 5 频谱细化 二 采用 matlab
  • 最少砝码问题(用一部分数的和/差表示区间上所有的整数)

    问题1 需要表示 1 N 的所有重量 最少需要多少砝码 答案 需要 1 2 4 ceiling logN 每个砝码代表二进制数的一位 N有ceiling logN 个二进制位 问题2 需要表示 1 N 的所有重量 手头已有一些砝码 问 怎样