前往
大廳
主題

ZeroJudge - f651: 開關燈 解題心得

Not In My Back Yard | 2021-03-17 21:32:39 | 巴幣 0 | 人氣 414

題目連結:


題目大意:
輸入有多列,每列給定一正整數 n (1 ≦ n ≦ 10 ^ 9),代表有 n 顆燈泡排成一列。一開始所有燈泡全部都是亮著的,而我們需要經過多次的操作將所有燈泡變為暗的。

每一次操作為選定一顆燈泡將其從亮變暗、暗變亮,而其左右相鄰的燈泡也會跟著改變狀態(亮變暗、暗變亮)。試問最少需要多少次操作才可以全亮的燈泡變為全暗?



範例輸入:
1
3
10


範例輸出:
1
1
4


解題思維:
觀察以下燈泡數之狀況:
n = 1 時,只有單一燈泡,直接更改該燈泡即可,所以為 1 次;
n = 2 時,兩燈泡相鄰,選其中一顆即可將兩顆都變暗,所以為 1 次;
n = 3 時,選最中間的燈泡可以將最左邊以及最右邊的燈泡都變暗,所以為 1 次;

n = 4 時,選最左邊的燈泡會跟著改變其右的燈泡,再選最右邊燈泡且會改變其左的燈泡,兩者不會重複更改,所以為 2 次操作;
n = 5 時,選最左邊以及從右邊數來第二顆即可用 2 次將所有燈泡變暗;
n = 6 時,選左邊數來第二顆以及右邊數來第二顆,同樣也是 2 次;

以此類推,每次選燈泡改變的時候不要與先前幾次重疊但是又要盡量地改變多顆。

因此,對於任意數量的燈泡 n ,其最少所需的次數為
floor((n + 2) ÷ 3)
其中,floor() 代表下高斯函數,代表著將數字向下取整(對於正數來說即無條件捨去小數)。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作