[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]\)為中位數時是最優的(證明以后再補吧)。照著式子寫代碼就好了。
轉載于:https://www.cnblogs.com/dummyummy/p/9795849.html
總結
以上是生活随笔為你收集整理的[HAOI2008]糖果传递 结论题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 的makefile文件实例
- 下一篇: 算法笔记(个人用)(不定期更新)