題目連結:
題目大意:
給定一正整數N(1 ≦ N ≦ 3 * 10 ^ 5),代表接下來有N個數字。
接著的每個數字i(編號從1開始,由左至右),代表第i個燈泡的狀態。「1」表示燈泡是亮的,「0」則是暗的。
而每喊一個數字K,所有編號是K的倍數之燈泡將會改變狀態(亮變暗、暗變亮)。
求把所有燈泡都變暗,最少需要喊幾個數字?
解題思維:
仔細觀察數列,當我們隨機喊一個數字K,會改變的只有 ≧ K的數字(更精確地說,K的倍數),而K的左方完全不會變動。因此如果K的左方如果有燈泡還是亮的,那就有極高的機會會被再次改變狀態,等同於白費功夫。
所以,我們可以推論,從最左邊的燈泡往右開始找起。如果遇到亮的燈泡,就喊此燈泡編號(也就更改了此編號的倍數之所有燈泡)。如此,便可以確保每個燈泡都會變暗,且所需喊的數字是所有方法當中最少的。
然後看中途喊了幾個數字,即是答案。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。