BZOJ1045 HAOI2008 糖果傳遞

2021-08-16 04:51:56 字數 1336 閱讀 9338

貪心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

x3=x2+k-a2=x1+2k-a2-a1

x4=x3+k-a3=x1+3k-a3-a2-a1

…… xn=xn-1+k-an=x1+(n-1)k-an-1-……-a1;

設a1-k=c1,a1+a2-2k=c2,a1+a2+a3-3k=c3,……,a1+……+an-1-(n-1)k=cn-1

則ans=|x

1|| x1

|+|x

1−c1

| |x1

−c1|

+|x1−c2

| |x1

−c2|

+……+|x

1−cn

−1| |x1

−cn−

1|

轉化為數軸上距離問題(x1到c1,c2,……,cn-1的距離),要令ans最小,只需使x1=c1,c2,……,cn-1的中位數即可

#include

#include

#include

#include

#include

using

namespace

std;

long

long a[1000005],c[1000005];

inline

long

long read()

return ans;

}int main()

/*if (s%n!=0)

題目裡沒有說無解的情況所以注釋啦,不過這樣會無解的吧qwq~

*/long

long k=s/n;

s=0;

for (int i=1; i<=n; i++)

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

long

long x,ans=0;

if (n&1) x=c[n/2+1];

else x=(c[n/2]+c[n/2+1])/2;

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

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

}

BZOJ 1045 HAOI2008 糖果傳遞

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

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個糖果。每人只能給左右兩人傳遞糖果。每...