題目背景
在新的一年,mxj給俱樂部的孩子們準備了一堆的禮物,它生成了乙個隨機數列表a,使得第i個人會得到a[i]件禮物。
但是,因為某些人得到的禮物太多,為了公平起見,mxj建議大家把禮物平均分配。
題目描述
大家圍成了乙個圈,每個人可以向他左邊或者右邊的人傳遞禮物,問,至少傳遞多少件禮物,
才能讓每個人得到的禮物件數相同呢?(保證禮物總數是人數n的倍數)
輸入格式:
第一行輸入乙個正整數n,表示俱樂部成員的個數。
接下來有n行,每行乙個整數a[i],表示第ii個成員初始得到的禮物的件數。
輸出格式:
輸出乙個整數,表示至少需要傳遞多少件禮物。
輸入樣例:41
254輸出樣例:
4思路:
原來禮物數為a1,a2,……,`an.
最終的禮物數為這些數的平均值,設為a
xi表示 i+1 給 i 的禮物個數
a1-xn+x1=a
a2-x1+x2=a
a3-x2+x3=a
a4-x3+x4=a
…an+x(n-1)-xn=a
則:x1=a-a1+xn
x2=2a-(a2+a1)+xn
x3=3a-(a3+a2+a1)+xn
…xn=na-(an+an-1+…a2+a1)+xn
在這裡可以求字首和:令si=(a1+a2+…ai)-ia 則xi=xn-si
最後的結果ans=|x1|+|x2|+|x3|+…|xn|=|xn-si|(i從1到n求和)
結果就是求|xn|+|xn-s1|+|xn-s2|+…+|xn-s[n-1]|的最小值,即xn取中位數
#include
#include
using namespace std;
#define maxn 1000000
int a[maxn+5]
;int
main()
sum/
=n;//求平均值
a[0]
-=sum;
for(
int i=
1;i) a[i]
=a[i]
+a[i-1]
-sum;
//求字首和
;sort
(a,a+n)
;//去中位數可以從小到大排序 去中間值
t=a[n/2]
;for
(int i=
0;i)ans+
=abs
(t-a[i]);
printf
("%lld\n"
,ans)
;return0;
}
貪心 均分紙牌
時間限制 1 sec 記憶體限制 64 mb 提交 164 解決 95 提交 狀態 討論版 有n堆紙牌,編號分別為1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌規則為 在編號為1堆上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編...
均分紙牌問題
有n堆紙牌,編號分別為1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌的規則為 在編號為1上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編號為n 1的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在要求找出一種移動方法,...
貪心 均分紙牌
題目鏈結 題目描述 有n堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為n的倍數。可以在任一堆上取若干張紙牌,然後移動。移牌規則為 在編號為1堆上取的紙牌,只能移到編號為2的堆上 在編號為n的堆上取的紙牌,只能移到編號為n 1的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在...