解题思路:

/*
将硬币平均分成三堆: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次,显然不是最优解。
*/

参考代码:

#include <stdio.h>

long chengzhongcishu(long n);


int main(void){
    long n;
    while(1){
        scanf("%ld",&n);
        if(n == 0) break;
        else {
            printf("%ld\n",chengzhongcishu(n));
        }                
    }
    return 0;
}

long chengzhongcishu(long n){
    long cishu = 0;
    if(n == 1) return 0;
    else if(n == 2 || n == 3) return 1;
    else {
        cishu++;
        while(n>3){
            if(n % 3 == 0){
                n = n/3;
                cishu++;
            }else {
                n = n/3 +1;
                cishu++;
            }
        }
        return cishu;
    }
}


点赞(9)
 

0.0分

11 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论