日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

9.20模拟赛T1[聪明的小偷]

發布時間:2024/3/13 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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=minai?,imod2==1

代碼很簡單
C o d e Code Code

#include<bits/stdc++.h>#define MAXN 100010 #define INF 0x3f3f3f3fusing namespace std;inline void read(int &s){s = 0; int w = 1; char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') w = -1; ch = getchar();}while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar();}s *= w; return ; }int n; int a[MAXN]; int ans = INF;int main() {//freopen("thief.in", "r", stdin);//freopen("thief.out", "w", stdout);read(n);if(n % 2 == 0){puts("0"); return 0;}for(int i = 1; i <= n; ++i){read(a[i]);if(i & 1){ans = min(ans, a[i]);}}printf("%d\n", ans - 1);return 0; }

總結

以上是生活随笔為你收集整理的9.20模拟赛T1[聪明的小偷]的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。