BOJ 170 Fake Coins

题目地址http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_problem.php?problem_id=170

这个题用到信息论里的几个概念。

信息量、熵(不会的百度一下)

假币可轻可重,每枚硬币都可能是假币。故此问题共有2*n种情况,每种情况的概率为1/(2*n)。所以此问题的熵为log(2*n)/log2。

实验最多可能出现三种结果 ,根据最大熵原理,这种实验在可能出现的各种事件具有相等的概率时,所提供的平均信息量最大,故实验提供的平均信息量不超过log3/log2。

设最少需称k次,则这k次实验提供的总信息量不超过k * log3/log2,又问题的模糊度(熵)为log(2*n)/log2 .故k * log3/log2≥log(2*n)/log2 ,得 k≥log(2*n)/log3。

#include<stdio.h>
#include<math.h>
int main(){
int t,T,n;
scanf("%d",&T);
for(t=1;t<=T;t++){
    scanf("%d",&n);
    printf("%d\n",(int)ceil(log(2*n)/log(3)) );
}
}

 

举个例子,12枚硬币找出其中的假币(或轻或重,只有1个)



第一次:将12枚硬币(1,2,3,4,5,6,7,8,9,10,11,12)平分成三堆,取两堆称(1,2,3,4),(5,6,7,8),出现两中情况 

情况1      两堆重量相等

               假币在未秤的4枚中。任取其中的3枚加上从已秤过的8枚中任取的1枚(1,9,10,11),平分成两堆称(1,9),(10,11)。出现两种情况

                情况1.1    两堆重量相等
                                 最后剩下的一枚是假币,再称一次知其比真币轻还是重。

                情况1.2    两堆重量不相等
                                设右重左轻,比较10,11,若相等,则9是轻假币,否则10,11中重的为重假币。

                                设左重右轻,比较10,11,若相等,则9是重假币,否则10,11中重的为轻假币。

情况2      两堆重量不相等,并假设右重左轻

                选出这样的两堆(1,5,6),(2,7,8)

                情况2.1    两堆重量相等

                                 则3,4称一次,重的为重假币。

                情况2.2    两堆重量不相等,并假设右重左轻,则1重或者7/8轻

                                 称7和8,若平,则1为重假币。否则轻者为轻假币。

                                 

                                

   

 

 

你可能感兴趣的:(BOJ 170 Fake Coins)