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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

糖果传递 (数学题)

發布時間:2025/3/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 糖果传递 (数学题) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

糖果傳遞

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?Time Limit:?2000ms ??Memory Limit:?262144KB

?老師準備了一堆糖果,?恰好n個小朋友可以分到數目一樣多的糖果.?老師要n個小朋友去拿糖果,?然后圍著圓桌坐好,?1個小朋友的左邊是第n個小朋友,?其他第i個小朋友左邊是第i-1個小朋友.?大家坐好后,?老師發現,?有些小朋友搶了很多的糖果,?有的小朋友只得到了一點點糖果,?甚至一顆也沒有L,?設第i個小朋友有ai顆糖果.?小朋友們可以選擇將一些糖果給他左邊的或者右邊的小朋友,?通過糖果傳遞最后使得每個小朋友得到的糖果數是一樣多的,?假設一顆糖果從一個小朋友傳給另一個小朋友的代價是1,?問怎樣傳遞使得所耗的總代價最小.

Input

輸入文件第一行一個正整數n,表示小朋友的個數. 接下來n,每行一個整數ai,表示第i個小朋友得到的糖果的顆數. n<=1000000. ai>=0,?保證ailongint/int范圍內, ai的總和在int64/long long范圍內.

Output

輸出只有一個數,?表示最小代價.

Sample Input

4 1 2 5 4

Sample Output

4

這是昨天周賽的一道題,當時沒有做出來,不過我認為這確實是一道好題。

這道題目看起來很復雜,仔細分析一下并不是太難。 首先,最終每個小朋友的糖果數量可以計算出來,等于糖果總數除以n,用ave表示。 假設標號為i的小朋友開始有Ai顆糖果,Xi表示第i個小朋友給了第i-1個小朋友Xi顆糖果,如果Xi<0,說明第i-1個小朋友給了第i個小朋友Xi顆糖果,X1表示第一個小朋友給第n個小朋友的糖果數量。 所以最后的答案就是ans=|X1| + |X2| + |X3| + ……+ |Xn|。 對于第一個小朋友,他給了第n個小朋友X1顆糖果,還剩A1-X1顆糖果;但因為第2個小朋友給了他X2顆糖果,所以最后還剩A1-X1+X2顆糖果。根據題意,最后的糖果數量等于ave,即得到了一個方程:A1-X1+X2=ave。 同理,對于第2個小朋友,有A2-X2+X3=ave。最終,我們可以得到n個方程,一共有n個變量,但是因為從前n-1個方程可以推導出最后一個方程,所以實際上只有n-1個方程是有用的。 盡管無法直接解出答案,但可以用X1表示出其他的Xi,那么本題就變成了單變量的極值問題。 對于第1個小朋友,A1-X1+X2=ave ?-> ?X2=ave-A1+X1 = X1-C1(假設C1=A1-ave,下面類似) 對于第2個小朋友,A2-X2+X3=ave ?-> ?X3=ave-A2+X2=2ave-A1-A2-x2+X1=X1-C2 對于第3個小朋友,A3-X3+X4=ave ?-> ?X4=ave-A3+X3=3ave-A1-A2-A3+X1=X1-C3 …… 對于第n個小朋友,An-Xn+X1=ave。 ? 我們希望Xi的絕對值之和盡量小,即|X1| + |X1-C1| + |X1-C2| + ……+ |X1-Cn-1|要盡量小。注意到|X1-Ci|的幾何意義是數軸上的點X1到Ci的距離,所以問題變成了:給定數軸上的n個點,找出一個到他們的距離之和盡量小的點,而這個點就是這些數中的中位數,具體證明在此省略,請自己證明。
#include<stdio.h> #include<algorithm> using namespace std; typedef long long LL; const int N = 1000000 + 10; int a[N], c[N]; int main() {int n, i;while(~scanf("%d",&n)){LL sum = 0;for(i = 1; i <= n; i++){scanf("%d",&a[i]);sum += (long long)a[i];}LL ave = sum / n;c[1] = 0;for(i = 2; i <= n; i++)c[i] = c[i-1] + a[i] - ave; sort(c+1,c+n+1);LL ans = 0;int mid = c[n/2+1]; //中位數for(i = 1; i <= n; i++)ans += abs(c[i] - mid); //距離和printf("%lld\n",ans);}return 0; }

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的糖果传递 (数学题)的全部內容,希望文章能夠幫你解決所遇到的問題。

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