这题实在没什么思路,网上找了一下答案。
基本思路是这样的:如果检测结果两块都是好的,则随意拿出来一块参与下一轮检测;一好一坏或者都是坏的,则一块都不拿;如果两两检测完剩余一块,也拿进来参与下一轮检测。
如果一开始就能够确定好的芯片多于坏的,则可以保证每轮检测结束好的芯片都多于坏的,一直到最后如果剩2块芯片,则两块肯定都是好的;剩3块芯片就再检测一次,如果结果都是好的,就随意取一片必定是好的;如果结果都是坏的,则剩下的那块肯定是好的。
来证明一下上面的结论:
设有x组好芯片,y组一好一坏的芯片,z组坏芯片,一共A块好的芯片,B块坏的芯片。可以看到A=2x+y,B=2z+y,当然可能还有一块多出来的,等会儿再讨论。
假设一开始就已知A>B,则2x+y>2z+y,可得x>z。某一轮检测结束剩下x个好芯片和z个坏芯片,还是有x>z,所以好芯片还是多于坏芯片。而且x+z<x+y+z,可得每次检测完都小于原规模的一半。
如果有一块多出来:
1、假设它是好的,则A=2x+y+1,由A>B得,2x+y+1>2z+y,得x+1/2>z,所以x+1>z,所以好芯片还是多于坏芯片。x+z+1<=x+y+z+1/2,可得每次检测完都小于原规模的一半。
2、假设它是坏的,则B=2z+y+1,由A>B得,2x+y>2z+y+1,得x>z+1/2,所以x>=z+1,好芯片还是多于坏芯片。x+z+1<=x+y+z+1/2,可得每次检测完都小于原规模的一半。
综上,可以证明这个方法是正确的,只要A>B,就一定能在最后一轮检测出一块好的芯片。
检测一块好的芯片递归式为:T(n)=T(n/2)+θ(n),时间复杂度θ(n),再用这块好的芯片去重新检测剩下的所有芯片,时间复杂度θ(n)。所以总共时间复杂度还是θ(n)。