均分紙牌模型之mxj分禮物

2021-09-10 15:48:40 字數 1384 閱讀 2449

題目背景

在新的一年,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的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。現在...