示例:解答:首先給一種列舉的解法:開闢大小為n的陣列,分別針對第i = 0,1,2,3…n 輪進行操作。輸入: 3
輸出: 1
解釋:初始時, 燈泡狀態 [關閉, 關閉, 關閉].
第一輪後, 燈泡狀態 [開啟, 開啟, 開啟].
第二輪後, 燈泡狀態 [開啟, 關閉, 開啟].
第三輪後, 燈泡狀態 [開啟, 關閉, 關閉].
你應該返回 1,因為只有乙個燈泡還亮著。
**:
int
bulbswitch
(int n)
else
state[n-1]
*=-1
, k++;}
int sum =0;
for(
int i =
0; i < n; i++)if
( state[i]==1
) sum++
;return sum;
}
執行結果:emmm…當n = 99999999時候超時。
優化:既然暴力列舉無法解決問題,那麼肯定有簡單的方法。老方法:找規律。用上述**執行n = 1~100的情況,發現規律如下:n = 0 時, 結果為0;n = 1~3 時,結果為1;n = 4~8 時,結果為2;n = 9~15 時,結果為3;n = 16~24 時,結果為4…ok,結論已經很明顯了。
**:
int
bulbswitch
(int n)
執行結果:
討論:為什麼會等於sqrt(n)這樣的結果?
初始時燈泡全部關閉,對於除最後乙個之外的每乙個燈泡,如果最終結果為亮,那麼需要進行奇數次開關操作,所以只有因子個數為奇數的燈泡序號才會結果為亮,而只有平方數的因子數為奇數,例如4 = 1 * 2 = 2 * 2, 而12 = 1 * 12 = 2 * 6 = 3 * 4。
對於最後乙個燈泡,如果不是平方數,一定是暗著的;反之是亮著的。
演算法題 燈泡開關問題
問題描述 有編號1 100個燈泡,起初所有的燈都是滅的。有100個同學來按燈泡開關,如果燈是亮的,那麼按過開關之後,燈會滅掉。如果燈是滅的,按過開關之後燈會亮。現在開始按開關。第1個同學,把所有的燈泡開關都按一次 按開關燈的編號 1,2,3,100 第2個同學,隔乙個燈按一次 按開關燈的編號 2,4...
319 燈泡開關
初始時有 n 個燈泡關閉。第 1 輪,你開啟所有的燈泡。第 2 輪,每兩個燈泡你關閉一次。第 3 輪,每三個燈泡切換一次開關 如果關閉則開啟,如果開啟則關閉 第 i 輪,每 i 個燈泡切換一次開關。對於第 n 輪,你只切換最後乙個燈泡的開關。找出 n 輪後有多少個亮著的燈泡。示例 輸入 3輸出 1解...
319 燈泡開關
初始時有 n 個燈泡關閉。第 1 輪,你開啟所有的燈泡。第 2 輪,每兩個燈泡你關閉一次。第 3 輪,每三個燈泡切換一次開關 如果關閉則開啟,如果開啟則關閉 第 i 輪,每 i 個燈泡切換一次開關。對於第 n 輪,你只切換最後乙個燈泡的開關。找出 n 輪後有多少個亮著的燈泡。示例 輸入 3 輸出 1...