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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[HAOI2008]糖果传递 结论题

發布時間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [HAOI2008]糖果传递 结论题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

\(n(n<1000000)\)個小朋友坐成一圈,每人有\(a_i\)個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞一個糖果代價為\(1\),求使所有人糖果數相等的最小代價。

暴力的做法比較顯然,有\(30\)分,這里就不再贅述了。
推一波式子:先考慮一條鏈的情況,\(a[i]\)為原數組,\(b[i]\)\(a[i]\)每項分別減掉平均數的數組,\(sum1[i],sum2[i]\)分別為\(a[i],b[i]\)的前綴和數組,\(ave\)為平均數。則\(ans\)可表示為\(\sum\limits_{i=1}^{n}|i*ave-sum1[i]|\),再化簡得到\(\sum\limits_{i=1}^{n}|sum2[i]|\)。然后是環形的情況,斷環為鏈的位置不同,會變化的量就是前綴和數組。假設斷環的位置為\(p\),則前綴和變為\(sum2[k+1]-sum2[k],sum2[k+2]-sum2[k]...\),減掉重復部分就是\(sum2[k]-sum2[1],sum2[k]-sum2[2]...\),所以答案就是\(\sum\limits_{i=1}^{n}|sum2[k]-sum2[i]|\),結論就是\(sum2[k]\)為中位數時是最優的(證明以后再補吧)。照著式子寫代碼就好了。

#include <cstdio> #include <algorithm>using namespace std;#define N 1000000int n; long long sum[N+5], ave;int main() {scanf("%d", &n);long long t, ans = 0;for(int i = 1; i <= n; ++i) scanf("%lld", &t), ave += t, sum[i] = sum[i-1]+t;ave /= n;for(int i = 1; i <= n; ++i) sum[i] -= i*ave;nth_element(sum+1, sum+(n+1)/2, sum+n+1);for(int i = 1; i <= n; ++i) ans += abs(sum[(n+1)/2]-sum[i]);printf("%lld", ans);return 0; }

轉載于:https://www.cnblogs.com/dummyummy/p/9795849.html

總結

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

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