XTU1254 Blance 如何实现称出1∼n 克的物品,请问最少需要几颗砝码?
题目描述
小明有一架天平,小明想称出1∼n 克的物品,请问最少需要几颗砝码?
比如小明想称出1∼4 克的物品,需要2颗砝码,为1和3克。
balance
输入
第一行是一个整数T(1≤T≤10000) ,表示样例的个数。 以后每行一个样例,为一个整数 (1≤n≤10 9 )。
输出
每行输出一个样例的结果。
样例输入
3
1
4
40
样例输出
1
2
4
证明一个定理(了解于知乎)
一、结论:
假设使用n+1个砝码,
对于每个n,可以称出的N的范围在
多于这个范围需要n=n+1,少于这个范围则只需要到n=n-1即可
对于题主提出的情况即为n=3,
二、应用:
对于任意N,根据(一)中闭区间的范围求出n值,即可得到所需求的砝码个数(n+1)。
假如N=6546587,求出log(6546587, base=3)~=14.2857, 即需要15个砝码,从1,3,9,27一直到3^14=4782969;由这15个砝码可以最多称出1-7174453中任何一个数字。
证明:
数学归纳法:
(1)对n=0,1,2,口算成立
(2)假设有k个砝码,可以称出不大于
的所有组合。
(3)那么加入第k+1个砝码:
我们可以看到
也即恰好为
的中间值,离两个端点的距离均为
。
而这个值正是(2)中k个砝码可以完美覆盖的数值范围
作者:周欣宇
链接:https://www.zhihu.com/question/30164499/answer/47003542
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
TIJIE:首先,放左面,放右面,和不放 有三种状态,把它想象成一个三进制问题;
即可以用1,3*3,3*3*3………等等来表示最少问题
下面给出AC代码:
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
freopen();
long long T,n;
cin>>T;
{
while(cin>>n){
long long ans = 0;
long long t = 1 , sum = 0;
while(sum<n){
ans++;
sum+=t;
t*=3;
}
cout<<ans<<endl;
}
}
return 0;
}
XTU1254 Blance 如何实现称出1∼n 克的物品,请问最少需要几颗砝码?的更多相关文章
- 至少要几个砝码,可以称出 1g ~ 40g 重量
请点赞关注,你的支持对我意义重大. Hi,我是小彭.本文已收录到 GitHub · AndroidFamily 中.这里有 Android 进阶成长知识体系,有志同道合的朋友,关注公众号 [彭旭锐] ...
- HDU5616 天平能否称出物体重量问题 01背包变形或者折半搜索
//hdu5616 void solve1(){dp[0]=1;for(int i=1;i<=n;i++){for(int j=INF;j>=val[i];j--){dp[j]|=(dp[ ...
- 求用1g、2g、3g的砝码(每种砝码有无穷多个)称出10g的方案有几种
#include <iostream> using namespace std; // ; // sup是保存多项式的数组,sup[n]中的值代表指数为i的系数 ,下标i是x的指数 // ...
- 一块40克的砝码,摔成4块,利用天平,刚好可以称出1~40g所有整数克,问:这4块分别是多少克
public static void main(String[] args) { List<Integer> list = new ArrayList<>();//记录每组数的 ...
- 设计一套砝码要求能称量出1 ~ 100g之间的任意重量,请问至少需要多少个砝码?以及每个砝码各自的重量是多少?
解析: 1g => 1g 2g => 1g 1g => 1 ~ 2g之间的重量 => 1g 2g => 1 ~ 3g之间的重量 4g => 1g 2g 1g =&g ...
- MT【142】Bachet 问题,进位制
问题: 满足下面两种限制条件下要想称出40以内的任何整数重量,最少要几个砝码: i)如果砝码只能在天平的某一边; ii)如果砝码可以放在天平的两边. 提示:对于 i)先证明如下事实: \[\textb ...
- NOI题库--砝码称重V2(多重背包2^n拆分)
以前只会写多重背包的原版,渣的不行,为了做此题不得不学习了一下,发现其实也不难,只要理解了方法就好多了(PS:其实和倍增挺像的) 8756:砝码称重V2 总时间限制: 1000ms 内存限制: 655 ...
- P2347 砝码称重 (01背包)
题目描述 设有 1g1g1g . 2g2g2g . 3g3g3g . 5g5g5g . 10g10g10g . 20g20g20g 的砝码各若干枚(其总重 ≤1000 \le 1000≤1000 ), ...
- 洛谷P2347 砝码称重 【多重背包】(方案数)(经典)
题目链接:https://www.luogu.org/problemnew/show/P2347 题目描述 设有1g.2g.3g.5g.10g.20g的砝码各若干枚(其总重<=1000), 输入 ...
随机推荐
- win10装机重装系统
win10装机 1● u启制件 http://www.laomaotao.org.cn/ http://www.laomaotao.org.cn/ 2● 目标盘 3● 安装 ...
- Sql server中如何将表A和表B的数据合并(乘积方式)
sql server中如何将表A 和表B的数据合并成乘积方式,也就是说表A有2条数据,表B有3条数据,乘积后有6条数据, 这就要用到sql中的笛卡尔积方式了 1.什么是笛卡尔积 笛卡尔积在SQL中的实 ...
- 【基础】火狐和谷歌在Selenium3.0上的启动(二)
参考地址:http://www.cnblogs.com/fnng/p/5932224.html https://github.com/mozilla/geckodriver [火狐浏览器] 火狐浏览器 ...
- linux用户管理 用户和用户组管理
用户组的基本命令 groupadd [选项] [参数] -g 指定新建工作的id -r 创建系统工作组,系统工作组的ID小于500,非系统工作组大于500 -K 覆盖配置文件"/etc/lo ...
- Win10系列:JavaScript 控件的使用
向页面中添加的控件可分为两种类型:标准的HTML控件和WinJS库控件.其中标准的HTML控件是指HTML标准中定义的基本控件,如按钮和复选框:WinJS库控件是为开发基于JavaScript 的Wi ...
- JS时间戳和时间之间转换
一.时间转换时间戳 var date = new Date(); //时间对象 var str = date.getTime(); //转换成时间戳 二.时间戳转换为时间 1.转换成形如 2018 ...
- 某些material英文翻译
chrome 铬,铬合金, 镀铬 matte 无光泽的,不光滑的 Decal 陶瓷的 duo color 双色 livery (这个没找到什么吊意思,我看像是一个类似打logo的材质)
- intelij idea常用设置
1.genneral设置 2.自动导包 3.设置显示行号和方法分隔符 4.忽略大小写提示代码 比如:输入str会让其提示String 5.去掉单行显示类,让idea多行显示,容易找到类 6.设置字体及 ...
- 4.5 C++重载、覆盖和遮蔽
参考:http://www.weixueyuan.net/view/6375.html 总结: 函数签名包括函数名和函数参数的个数.顺序以及参数数据类型. 需要注意的是函数签名并不包含函数返回值部分, ...
- Jmeter响应中中文乱码怎么解决
在jmeter的bin目录下有一个jmeter.properties的文件,打开它,搜索sampleresult.default.encoding,把它的注释打开,也就是把最前面的#去掉,改成samp ...