Open LarryLuTW opened 8 years ago
目前想法是如果n為奇數,輸出一定為2,因為只需要減去他們中位數,以中位數切割的前後兩段序列便會一樣,所以只需要兩次。
至於n為偶數....未完待續XD
若 n = 5 原本 -> 1, 2, 3, 4, 5 後面三個減去 3 -> 1, 2, 0, 1, 2 把 1, 2 減去 1 -> 0, 1, 0, 0, 1 把 1 減去 1 -> 0, 0, 0, 0, 0 總共三次喔~
我好像發現規則了!!! OUTPUT = log2(n)+1 時間複雜度:O(1)
感覺也可以用DP做~ if n=7, then 1,2,3,4,5,6,7 (1)扣掉中位數4 =>1,2,3,0,1,2,3,所以我們只要在求n=3的個數就好
嗯嗯對 不過可能不是 O(1) 感覺 log2(n) 的複雜度會是 O(log n)
可是我只需要呼叫function這樣不是只做一次嗎(只需要計算)
嗯嗯是只做一次阿 但是 log2(n) 本身就不是 O(1) 而且這樣是不是會得到小數?
哦哦~ 所以我會(int)ans!
其實建議一直除 2 就好了 因為 log2(n) 要算滿久的 他算了很久好不容易求得精確的小數 結果又換回整數有點浪費
內容:
給定一個正整數 n 你的任務是要用最少的操作次數把序列 1, 2, ..., n 中的所有數都變成 0 每次操作可從序列中選擇一個或多個整數 同時減去一個相同的正整數
例如 1, 2, 3 可以同時把 2, 3 同時減 2 得到 1, 0, 1 在把兩個 1 同時減 1 得到 0, 0, 0 操作次數是 2
輸入說明:
一個正整數 n (n <= 10^9)
輸出說明:
輸出最少操作次數
範例輸入:
範例輸出: