题目地址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为重假币。否则轻者为轻假币。