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