串珠子
題目地址:
http://www.nowcoder.com/question/next?pid=1597148&qid=44664&tid=3206491
描述
現在A和B在玩一個遊戲,這個遊戲首先給了他們很多珠子,珠子有兩種顏色,一種藍色,一種黃色,我們假定兩種珠子都有無限多。A需要選擇n顆珠子(n爲奇數),然後由B串成一串項鍊(順序由B確定,這裏的項鍊也就是一個環)。假如在最後串成的項鍊中,A能夠找到兩個不同位置的藍色珠子,並在這兩處把這個項鍊斷開成兩段,其中一段恰好長度爲(n+1)/2那麼A就勝利了,注意這裏爲整數截斷除法且這個長度是不包括選出的兩顆珠子的。現在請你計算出A至少要選擇多少顆藍色珠子,才能保證無論B怎麼串,他都能獲勝。舉個例子,當A選了7顆珠子,其中有3顆藍珠子,那麼如果B串的項鍊爲”藍藍紅紅紅紅藍”,則A能獲勝,若B串的項鍊爲”藍藍紅紅藍紅紅”,則A不能獲勝。
輸入
給定一個整數n,爲A要選出的珠子顆數.
輸出
請返回A至少要選的藍珠子顆數。
思路
先說結論
int find_k(int n) {
if (0 == n%3) {
return n / 2;
} else {
return (n+1) / 2;
}
}
證明如下
假如我是B,我會用最優方式串珠子,那麼怎麼串呢,如下圖
圖1:我們如何串珠子(
假如我們第一個串藍的(圖中紅色),那麼,第L%n和第(n-L)%n一定不是能藍珠子,相應的我們會在 2L%n 和 (2n-2L)%n 放紅珠子(圖中綠色)。
當n不是3的倍數的時候一切OK。
當
解方程
因爲n爲奇數,所以k也必然是奇數,所以xy存在整數解
所以
所以必然在放一個藍色珠子的時候會與一個相應的紅色珠子位置衝突,此時,能放入的藍色珠子便會比正常情況少1。