題目連結:
題目大意:
給定一個整數K(0 ≦ |K| ≦ 1, 000, 000, 000)。
找到一個最小的N,滿足:
± 1 ± 2 ± 3 …… ± N = K
其中「±」代表可以是「加法(正)」或「減法(負)」,從其中擇一。
範例輸入:
12
-3646397
範例輸出:
7
2701
解題思維:
我們先考慮K值為正的情況:
因為是要找最小的N,因此要先找到從1加到N會不小於K的N值(這樣可以確保總和成長速度最快)。
然後,如果現有的N值所給出的總和與K的差不為2的倍數(也就是奇數),就把N加1,直到兩者的差為2的倍數。
而為何差要是2的倍數呢?以K=12為例:
一開始,我們會找到N=5,代表1 + 2 + 3 + 4 + 5 = 15。
我們可以試圖調整1~5的正負號試圖讓上列等式的結果為12。但是,我們可以發現,15與12差3,因此無法藉由更改前面的數字之正負號來湊出12。
所以讓N=6,代表總合為21。與上面同理,差仍然是奇數。因而再讓N=7。
這時,總合為28,與12的差為16。而14是一偶數,因此我們可以調整,例如1、7的正負號,使等式為
-1 + 2 + 3 + 4 + 5 + 6 - 7 = 12。
而其他的正的K值也是同理。
再來討論K值為負的情況,我們可以很清楚的觀察到:其實就只是把上列的等式左右邊各乘上一個(-1)。就變成了K值為正的情況了。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。