开关和灯泡的对应关系
????? 答案:
????? 設三個開關是1、2、3。打開開關1等半個小時,關上開關1并打開開關2。
????? 進房后去摸燈泡,熱的是開關1對應的燈泡;亮的是開關2對應的燈泡;不亮不熱的是開關3對應的燈泡。
????? 分析:
????? 首先想到的就是通過打開不同的開關,進去后看燈是否亮來找出對應關系??赡艽蜷_的開關數量只有0,1,2,3共四種情況,沒有一種情況能解決這個問題。所以必須找到其它的信號。鑒于燈泡亮一段時間后會發熱,我們可以使用燈的熱度作為一個信號。這樣我們就有了熱且亮,熱不亮,亮不熱,不熱不亮四種狀態,足以用來區分三只燈泡了。
????? 這個題可以理解成一個編碼問題,燈泡的狀態作為編碼空間,進屋的次數作為編碼位數。
????? 如果只使用燈泡是否亮來判斷,題目就相當于用一位二進制數來表示三種狀態,是不可能的事情。加入了燈泡是否熱后,就相當于用一位四進制數來表示三種狀態,足夠了。
????? 此題的一些可能變化:?
1、在房里有四盞燈,房外有四個開關,在房外看不見房內的情況,你只能進門一次,你用什么方法來區分哪個開關控制哪一盞燈?
2、在房里有n盞燈,房外有n個開關,在房外看不見房內,且進門后只能觀察燈的亮度的情況下,你需要進門多少次才能區分哪個開關控制哪一盞燈?
3、在房里有n盞燈,房外有n個開關,每個開關有三種狀態(開,關,半開(亮度為開的一半))在房外看不見房內,且進門后只能觀察等的亮度的情況下,你需要進門多少次才能區分哪個開關控制哪一盞燈??????????????
?
?
其他題目:
現有共2007只燈均亮,每個燈都只有一個開關,第一次按2倍數的燈開關,第二次按3倍數的燈,第三次按5倍數的燈,最后亮燈有幾只?
思路:這個題目跟集合的并集是有關系的,首先這么思考,一個燈的開關操作偶數次跟沒有操作是一樣的效果,操作一次跟操作奇數次是一樣的效果。則2的倍數與3的倍數交集中減去2、3、5的倍數共同交集剩下的集合操作了偶數次,跟沒有操作是一樣的,所以這些燈還是亮著的,而2、3、5倍數的并集的補集中的這些燈一直沒有操作,狀態是沒有變化的,一直都是亮著的。。
所以:2007中2的倍數有1003個
2007中3的倍數有669個
2007中5的倍數有401個
2007中6的倍數有334個
2007中10的倍數有200個
2007中15的倍數有133個
2007中30的倍數有66個
2、3、5倍數的并集的補集為2007-(1003+669+401-334-200-133+66)=535 這些燈一直沒有操作,狀態是沒有變化的,一直都是亮著的。。
2的倍數與3的倍數交集中減去2、3、5的倍數共同交集剩下的集合操作了偶數次,跟沒有操作是一樣的,這些燈共有268盞。。
同理另外134盞和67盞燈都是操作了偶數次,跟沒有操作是一樣的,也是亮著的。。
所以:最后的亮燈共有535+268+134+67=1004
驗證程序如下:
#include <stdio.h> #include <stdlib.h>void main() {int a[2008],i,sum=0;for(i=1;i<2008;i++)a[i]=1;for(i=1;i<2008;i++){if(i%2==0)a[i]=1-a[i];}for(i=1;i<2008;i++){if(i%3==0)a[i]=1-a[i];}for(i=1;i<2008;i++){if(i%5==0)a[i]=1-a[i];}for(i=1;i<2008;i++){if(a[i]==1) //統計亮燈的個數sum++;}printf("%d\n",sum);system("pause"); }擴展題:
有1到100號的燈,一開始全部點亮。每盞燈都有獨立的開關,且開關只有“開”和“關”兩種狀態。
第一次把所有1的倍數燈的開關按一次,第二次把所有2的倍數燈的開關按一下,一直到第一百次把所有100的倍數燈的開關按一下。
問,此時還有多少燈亮著?
因為開始時全部亮著,只有開關按偶數次的才會亮著。
實際上是問1,2,3,...,100這100個每個數的約數的個數。除了平方數,1,4,9,16,...,100(共10個外),其它所有數的約數的個數都是偶數個。因而最后亮燈的有100-10=90個。
(所有的平方數,其約數的個數都是奇數個,比如4^2=16, 當約數是4時,無法找到另外一個不同的約數與之配對)。
?
?
總結
以上是生活随笔為你收集整理的开关和灯泡的对应关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 面试智力题:天平称球
- 下一篇: c++模板类学习