文章目录

1 题目

有假币
时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小)
题目描述
居然有假币! 现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。nowcoder这就去买猪肉,结果找来的零钱中有假币!!!可惜nowcoder一不小心把它混进了一堆真币里面去了。只知道假币的重量比真币的质量要轻,给你一个天平(天平两端能容纳无限个硬币),请用最快的时间把那个可恶的假币找出来。

输入描述:
1≤n≤2^30,输入0结束程序。

输出描述:
最多要称几次一定能把那个假币找出来?

输入例子:
3
12
0

输出例子:
1
3

2 解析

2.1 题意

见题

2.2 思路

分3份比2份的找到硬币所需次数少。

因为对于要称量的硬币,每次称量前分成3份,要求前两份的个数不小于第三份。如果前两份重量是一样,那么假币在第三份中,这样就除去了2/3的硬币。

如果前两份重量不一样,那么假币在重量轻的一份中,这样也除去了2/3的硬币。

这样以来,称量一次除去了将近2/3的硬币,一直重复上面的分法,就可以很快求出称量次数。

例如:
对于 1个硬币,称量 0次
对于 2个硬币,称量 1次
对于 3个硬币,称量 1次

对于 4个硬币,称量 2次,先分成(2,2,0),第一次称量前两份(2,2),如果重量不一样,再次求出判断另外2个硬币需要称量的次数。

对于 5个硬币,称量 2次,先分成(2,2,1),第一次称量前两份(2,2),如果重量不一样,再次判断另外1个硬币需要称量的次数。

对于 6个硬币,称量 2次,先分成(2,2,2),第一次称量前两份(2,2),如果重量不一样,再次判断求出另外2个硬币需要称量的次数。

对于 7个硬币,称量 2次,先分成(3,3,1),第一次称量前两份(3,3),如果重量不一样,再次判断求出另外3个硬币需要称量的次数。
。。。
一直到10个硬币,才称量三次。。。

3 参考代码

#include 
#include

int main()
{
int n;
while (~scanf("%d",&n))
{
if (n == 0)
break;

long long ans = (int)ceil(log(n) / log(3));//向上取整
printf("%lld\n", ans);
}
}