千杯毒酒(巧妙運用二進制解題)


 原題:

1000 瓶無色無味的葯水,其中有一瓶毒葯,10只小白鼠拿過來做實驗。喝了無毒的葯水第二天沒事兒,

喝了有毒的葯水后第二天會死亡。如何在一天之內(第二天)找出這瓶有毒的葯水?

改編版:

有n被毒酒,求檢驗出毒酒所用的最少小白鼠?

原題思路:

利用二進制思想
可以首先把小白鼠用二進制表示,然后
巧妙的利用1和0標志位來表示喝與不喝
比如有4瓶
00 01 10 11 
就可以找兩只小白鼠
1號喝3 4  (也就是所有第一位是1的)
2號喝1 2就可以得到所有情況
如果1號死了就是3有毒
2死了就是2有毒
1 2都死了就是4有毒
都沒死就是1有毒

這樣就很巧妙的解出了原題,1000小於2^10(1024),按剛才的邏輯10只就可以找出毒酒

改編版題解:

通過找規律可以得出(2^n)+1~2^(n+1)之間都是需要n+1只

就可以先判斷這個數是不是2的冪,有三種方法

1、判斷此數二進制中是不是有一個1,具體算法自己實現;

2、x == x&(-x) 由於x&(-x)返回的是從右到左第一個1所表示的大小;對於110010000 返回的就是 10000;所以可以用來判斷;

3、x&(x-1)==0 舉個例子:1000 它減1變成 0111 與運算得0 所以是2的冪次方;

然后循環一下就可以了,每次除2,如果是2的冪最后再加上1就是結果了。

奉上鄙人的代碼:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
    int t,n,i,ans;
    scanf("%d",&t);
    for(i=0;i<t;i++){
        scanf("%d",&n);
        ans=0;
        if(n&(n-1)!=0){
            ans++;
        }     
        while(n/2>=1){
            n/=2;
            ans++;
        }
        printf("%d\n",ans);    
    }
    return 0;
}

總結:

有的時候看似不可能的問題總是能找到巧妙的解法,尤其是一件事物有二面性的時候,

一定要考慮二進制,當然二進制用的6還要熟練位運算qwq

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM