BZOJ1045 糖果傳遞(基於貪心的數學題)

2022-05-14 14:47:56 字數 1046 閱讀 3592

點此看題面

大致題意:有\(n\)個小朋友坐成一圈,每人有\(a[i]\)個糖果。每人只能給左右兩人傳遞糖果,傳遞乙個糖果代價為1,求使所有人獲得均等糖果的最小代價。

這題其實是一道帶有濃厚數學色彩的貪心題。

我們可以先用\(sum\)來統計\(a[i]\)之和,然後將\(sum\)除以\(n\),從而求出最後每個小朋友應該擁有的糖果的個數。

我們可以用\(s[i]\)來表示第\(i\)個人給第\(i+1\)個人的糖果數量(如果為負,表示第\(i+1\)個人給第\(i\)個人\(-s[i]\)顆糖果),特殊的,\(s[n]\)表示第\(n\)個人給第\(1\)個人的糖果數量。

我們可以發現,對於第\(i\)個人,他的手上拿著的糖果數應為\(a[i]+s[i-1]\),即他原本擁有的糖果和第\(i-1\)個人給他的糖果,又由於每個人應拿的糖果數為\(sum\),所以\(a[i]+s[i-1]-sum\)即為他要交給第\(i+1\)個人的糖果數。

即\(s[i]=a[i]+s[i-1]-sum\)。

那麼$$ans=sum_^n |s[i]-s|$$

其中,\(s\)為乙個定值。而我們的目的就是取乙個合適的\(s\)使\(ans\)最小。

那麼,這道題目就變成了乙個我們很熟悉的乙個經典數學問題了,我們可以將\(s[1]\sim s[n]\)一一對應到數軸上,不難發現,最優的\(s\)應為\(s\)陣列的中位數

這樣一來,這題就很簡單了。

#include#define max(x,y) (x>y?x:y)

#define min(x,y) (x'9')&&ch!='-') ch=getchar();

if(ch=='-') f=-1,ch=getchar();

while(ch>='0'&&ch<='9') (x*=10)+=ch-'0',ch=getchar();

return x*=f;

}void write(ll x)

int main()

BZOJ 1045 糖果傳遞 數學 遞推

1045 haoi2008 糖果傳遞 time limit 10 sec memory limit 162 mb submit 2975 solved 1327 submit status discuss description 有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每...

BZOJ1045 糖果傳遞(基於貪心的數學題)

點此看題面 大致題意 有n nn個小朋友坐成一圈,每人有a i a i a i 個糖果。每人只能給左右兩人傳遞糖果,傳遞乙個糖果代價為1,求使所有人獲得均等糖果的最小代價。數學轉換 這題其實是一道帶有濃厚數學色彩的貪心題。我們可以先用sum sumsu m來統計a i a i a i 之和,然後將s...

BZOJ 1045 HAOI2008 糖果傳遞

有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞乙個糖果代價為1。第一行乙個正整數n 987654321,表示小朋友的個數 接下來n行,每行乙個整數ai,表示第i個小朋友得到的 糖果的顆數 求使所有人獲得均等糖果的最小代價。4 1254 4 結論題 設每個人剛開始有a...