BZOJ 1045 HAOI2008 糖果傳遞

2021-07-31 10:37:04 字數 968 閱讀 8153

有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞乙個糖果代價為1。

第一行乙個正整數n<=987654321,表示小朋友的個數.接下來n行,每行乙個整數ai,表示第i個小朋友得到的

糖果的顆數.

求使所有人獲得均等糖果的最小代價。 4

1254

4~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

結論題~

設每個人剛開始有a[i],給出b[i],c[i]=a[i]-tot的字首和,最終成為tot個,那麼

a[1]-b[1]+b[2]=tot;

a[2]-b[2]+b[3]=tot;

……化簡得

b[2]=tot-a[1]+b[1]=b[1]-c[1];

b[3]=tot-a[2]+b[2]=b[1]-c[2];

……所以所求就相當於是數軸上距離所有點的距離總和最小的點,是所有點的中位數。

注意開long long!

#include#include#include#includeusing namespace std;

#define ll long long

int n,a[1000001],c[1000001];

ll tot,ans;

int read()

while(ch>='0' && ch<='9')

return x*f;

}int main()

tot/=n;

for(int i=1;i<=n;i++) c[i]=c[i-1]+a[i]-tot;

sort(c+1,c+n+1);

tot=c[(n>>1)+1];

for(int i=1;i<=n;i++) ans+=abs(c[i]-tot);

printf("%lld\n",ans);

return 0;

}

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...

BZOJ1045 HAOI2008糖果傳遞(貪心)

顯然最後每個小朋友所擁有的糖果數就是糖果數總和的平均數。設該平均數為t。環的問題一般斷成鏈,但這個題似乎沒有什麼很好的辦法在列舉斷點的時候快速算出答案 我甚至不知道會不會有斷點 於是我們假裝把他斷開了。假裝現在我們已經知道了1號小朋友要給n號小朋友x顆糖果 可以為負 那麼,2給1,3給2,4給3,等...

BZOJ 1045 糖果傳遞 數學 遞推

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