【推導】The 16th UESTC Programming Contest Preliminary L - Foxtrot

題意:有n瓶藥劑,其中只有一瓶藥劑有毒。讓你用最少的小白鼠試出哪瓶有毒。你只有一次給任意只小白鼠各餵食任意種類藥劑的機會。spa

m只老鼠就能對應2^m種「生死狀態」的組合,給每種狀態分配一個種類的藥劑,而後給每隻老鼠餵食「若是它在這種藥劑對應的生死狀態下死去」的全部藥劑,就能夠根據發生的死亡狀況,分辨出哪瓶藥劑有毒。blog

好比老鼠數有3只。io

000 1class

001 2di

010 3co

100 4math

110 5return

011 6printf

101 7

111 8

給一號鼠喂4578

給二號鼠3568

給三號鼠2678。

因此答案爲(ceil)log2(n)。

#include<cstdio>
#include<cmath>
using namespace std;
typedef long long ll;
int T,n;
int main(){
	scanf("%d",&T);
	for(;T;--T){
		scanf("%d",&n);
		if(n==1){
			puts("0");
			continue;
		}
		for(int i=1;i<=30;++i){
			if((1<<i)>=n){
				printf("%d\n",i);
				break;
			}
		}
	}
	return 0;
}
相關文章
相關標籤/搜索