9.20模拟赛T1[聪明的小偷]
聰明的小偷
(thief.pas/c/cpp)
袋,首先他會先檢查每個口袋是不是都有硬幣,之后他會計算出第 1 個和第 2 個口袋的硬幣數量之和,第 2 個與第 3 個口袋的硬幣數量和,如此直到第 n-1 個與第 n 個口袋的硬幣數量之和,得到 n-1 個數的序列。如果收藏家發現某個口袋沒有硬幣,或者他計算得到的序列較上一天相比有變動,那么收藏家就知道肯定有人動了他的硬幣。有一個聰明的小偷,他想在收藏家不知道的情
【輸入格式】
第一行一個正整數 n,表示口袋的個數。
接下來一行 n 個正整數,第 i 個正整數表示第 i 個口袋里裝的硬幣數量。
【輸出格式】
一行一個正整數,表示答案。
【輸入輸出樣例】
thief.in thief.out
三組:
①
3
1 2 3
0
②
4
2 4 6 8
0
③
5
2 3 4 5 6
1
【樣例解釋】
第一個樣例中,小偷無法在收藏家不知道的情況下移動硬幣。
第二個樣例中,盡管小偷可以移動硬幣,比如移動成 3 3 7 7,但是他仍然
無法拿出硬幣。
第三個樣例中,小偷將 1,5 口袋的一個硬幣移動到 2,4 口袋中,并在口袋 3
中拿出一個硬幣即可。
【數據規模與約定】
對于 50%的數據,有 2≤n≤20,每個口袋中硬幣數量≤20。
對于 100%的數據,有 2≤n≤999,每個口袋中硬幣數量≤10000 且為正整數。
對于這道題,(其實我剛開始就沒反應過來,覺得這怎么偷),我們可以先看著解釋手推樣例,可能剛開始寫出來看不出什么,不過我們可以發現一點,
就是在每次小偷第一次移動硬幣時,小偷只能移動第一個或最后一個,而且是只能移動到自己后一個或前一個袋子里。
為什么是這樣呢?
我們考慮一下收藏家這種查詢的性質,因為是兩兩只和,所以一個數可以影響的和是兩個,但是在邊界的兩個數字只能影響一個,而且若只移動到相鄰數字上的話,邊界數字影響的和是始終不變的,把第一個位置的數移x到第二個部分里,第一個和第二個的和不變,第二個和第三個的和增加x,后面不變。把最后一個的數移x到倒數第二個上,最后一個和倒數第二個和不變,倒數第二個和倒數第三個和增加x。同時如果我們把第三個數向第四個數移x情況是一樣的,那么我們的和增加的x就會向中間聚攏,所有有移錢操作的袋子下標都是奇數,如果n為奇數的話,中間就有 a m i d ? 1 , a m i d , a m i d + 1 a_{mid - 1}, a_{mid}, a_{mid + 1} amid?1?,amid?,amid+1?這時候 a m i d ? 2 和 a m i d + 2 a_{mid - 2}和a_{mid +2} amid?2?和amid+2? 都向相鄰的 a m i d ? 1 , a m i d + 1 a_{mid - 1}, a_{mid + 1} amid?1?,amid+1?移了x錢,這時候 a m i d a_{mid} amid?與前后兩項的和都增加了x,同時你不能將錢向兩邊傳遞了(因為是兩邊傳過來的),這時你就可以從 a m i d a_mid am?id中拿出x使兩邊的和不變。
同時我們可以發現,如果n是偶數,那么在向兩邊傳遞的時候是沒有一個 a m i d a_{mid} amid?可以通過減去x來使兩邊的和合法。因此偶數時我們是拿不走錢的。
并且當n為奇數時,移錢的下標是奇數,也就是說,在n是奇數的條件下,最多能移的錢 x = m i n ( a i ) , i m o d 2 = = 1 x = min(a_i), i mod 2 == 1 x=min(ai?),imod2==1
代碼很簡單
C o d e Code Code
總結
以上是生活随笔為你收集整理的9.20模拟赛T1[聪明的小偷]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国商业环境发展的五个阶段浅析
- 下一篇: 大数据CDC技术