看下这道人民币构造的题目,是怎么样达到平衡的一个具体题目
找到了原型,其实是天平平衡的问题,如下
对于这样的平衡三进制问题,怎么解题?这里主要提供解题方法
砝码质量为
1
,
3
,
9
,
27
,
81...
1,3,9,27,81...
1,3,9,27,81...是以1为首项,3为公比的等比数列,如果用三进制表示
a
n
a_n
an,那么每一位则是
0
,
1
,
2
0,1,2
0,1,2和二进制一样转化
#example1 10->101 然后把对应位置的砝码放在对侧,即1和9
#example2 17->122 如果出现了2,则从右到左把2减3,并在左边一个数加1
17->122->1 3 -1->2 0 -1->1 -1 0 -1 最终不留下数字2 然后把1对应砝码放对侧,-1对应砝码放同侧
使用
n
+
1
n+1
n+1个砝码,对于每一个
n
,
n,
n,能测得的哪个N是在一个范围内的:
[
3
n
+
1
2
,
3
n
+
1
−
1
2
]
[\frac{3^n+1}{2},\frac{3^{n+1}-1}{2}]
[23n+1,23n+1−1]
而我们用
3
k
(
k
=
0
,
1
,
2
,
3...
)
3^k(k=0,1,2,3...)
3k(k=0,1,2,3...)可表示出
[
1
,
3
n
+
1
−
1
2
]
[1,\frac{3^{n+1}-1}{2}]
[1,23n+1−1]的所有整数
对于纸币构造问题输入最大数n,求出纸币种类数k
n
<
=
3
k
+
1
−
1
2
n<=\frac{3^{k+1}-1}{2}
n<=23k+1−1
⇒
k
>
=
l
o
g
3
(
2
n
+
1
)
−
1
\Rightarrow k>=log_3(2n+1)-1
⇒k>=log3(2n+1)−1
同时,
n
>
=
3
k
+
1
2
n>=\frac{3^k+1}{2}
n>=23k+1
⇒
k
<
=
l
o
g
3
(
2
n
−
1
)
\Rightarrow k<=log_3(2n-1)
⇒k<=log3(2n−1)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i;
cin>>n;
for(i=0;;i++)
{
if(n>=(pow(3,i)+1)/2&&n<=((pow(3,i+1)-1)/2))
{
cout<<i+1;
break;
}
}
return 0;
}
引用资料:
平衡三进制的讨论