题目 1187: 假币问题

题目描述:

居然有假币!!! 
事情是这样的,现在猪肉涨了,但是农民的工资却不见涨啊,没钱怎么买猪肉啊。老王这就去买猪肉,结果找来的零钱中有假币!!!可惜老王一不小心把它混进了一堆真币里面去了。现在知道假币的重量比真币的质量要轻。给你一个天平,请用最快的时间把那个可恶的假币找出来。

解题思路:

将硬币平均分成三堆:A,B,C,若不能平分,则需保证A,B两堆必须数目相同,且A,B的数量要比C多,其中AB用于称重比较,对于一次称重,若A == B,则假币在C,若A != B,则,假币在轻的那堆。然后对假币所在的那堆,继续分三堆处理…… 直到找到假币

注意:虽然分两堆,也能找到假币,但显然需要称重的次数要比分三堆的次数多一些,不符合题目要求。 A,B的数量要比C多,是为了保证算法的正确性,比如 N = 8,可分成,2 2 4 或者 3 3 2。若按照 3 3 2分堆,则总共需要称重2次,若分成2 2 4分堆,则总共需要称重3次,显然不是最优解。

代码:

package lanqiao;

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext())
        {
            int n = sc.nextInt();
            if(n == 0){
                break;
            }
            int count = 0;
            while(n != 1)
            {
                if(n % 3 == 0)
                {
                    n = n / 3;
                    count ++;
                }else {
                    n = n / 3 + 1;
                    count ++;
                }
            }
            System.out.println(count);

        }
    }
}

你可能感兴趣的:(蓝桥杯,算法)