BZOJ1045 HAOI2008糖果傳遞(貪心)

2022-05-22 00:48:11 字數 980 閱讀 8912

顯然最後每個小朋友所擁有的糖果數就是糖果數總和的平均數。設該平均數為t。

環的問題一般斷成鏈,但這個題似乎沒有什麼很好的辦法在列舉斷點的時候快速算出答案(我甚至不知道會不會有斷點)

於是我們假裝把他斷開了。假裝現在我們已經知道了1號小朋友要給n號小朋友x顆糖果(可以為負)。那麼,2給1,3給2,4給3,等等等等,小朋友之間傳遞的糖果數都被確定了。

1號給了n號x顆後,其還剩a1-x顆,那麼2號小朋友就要給1號t-(a1-x)=x-(a1-t)顆。

把1、2號看成整體,給了n號x顆後,其還剩a1+a2-x顆,那麼3號小朋友就要給他們x-[(a1+a2)-t*2]顆。

以此類推,k號小朋友要給k-1號x-[(a1+a2+……+ak-1)-t*(k-1)]顆。

我們的目標是使上面所有數的絕對值之和最小。與這個值有關的量裡只剩x是變數了。

那麼什麼時候這個值最小?假裝這有乙個數軸,有一些點是0,a1-t,(a1+a2)-t*2,等等等等。

我們要找乙個點x使得其到這些點的距離之和最小。顯然放在最中間,也就是中位數的位置就行了。

stl裡有個nth_element的黑科技,線性找第k大。

//

luogu-judger-enable-o2

#include#include

#include

#include

#include

#include

using

namespace

std;

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}#define n 1000010

intn;

long

long a[n],s[n],k,ans=0

;int

main()

BZOJ 1045 HAOI2008 糖果傳遞

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

BZOJ1045 HAOI2008 糖果傳遞

貪心w 設每個人原來的糖果數為ai,最後的糖果數為k 即平均數 第1個人給了第n個人x1顆糖 第i個人給了第 i 1 個人xi顆糖 i 1 那麼ans x 1 x1 x 2 x2 x n xn k a1 x1 x2 a2 x2 x3 an 1 xn 1 xn an xn x1 即x2 x1 k a1...

BZOJ 1045 糖果傳遞 數學 遞推

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