1045: [haoi2008] 糖果傳遞
time limit: 10 sec memory limit: 162 mb
submit: 2975 solved: 1327
[submit][status][discuss]
description
有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞乙個糖果代價為1。
input
小朋友個數n 下面n行 ai
output
求使所有人獲得均等糖果的最小代價。
sample input
4 1
2 5
4sample output
4hint
100% n<=987654321
(這個資料範圍加了特技,真實範圍n<=1000000,duang)
數學題,可以說是**均分紙牌**的環狀問題
首先陣列get【i】表示第i個小朋友從第i+1個小朋友那裡得到的糖果,可正可負
所以也可以表示第i+1個小朋友給第i個小朋友的糖果,即第i+1個小朋友失去的數量
所以我們不難得出:
candy【i】+get【i】-get【i-1】=pj(平均)
這一步並不足以求解
所以移項可得:
get【i】=pj-candy【i】+get【i-1】
上述式子可以推出get的值,那麼問題在於從**開始最小
問題為圓環,最小想到距離,距離想到中位!!
於是…..a之
**精煉至極:
#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 1000002
long
long candy[maxn]=;
long
long get[maxn]=;
int main()
pj=sum/n;
for (long
long i=1; i<=n; i++)
get[i]=get[i-1]+pj-candy[i];
sort(get+1,get+n+1);
long
long mid=get[(1+n)/2];
for (long
long i=1; i<=n; i++)
ans+=fabs(mid-get[i]);
printf("%lld",ans);
return
0;}
BZOJ1045 糖果傳遞(基於貪心的數學題)
點此看題面 大致題意 有n nn個小朋友坐成一圈,每人有a i a i a i 個糖果。每人只能給左右兩人傳遞糖果,傳遞乙個糖果代價為1,求使所有人獲得均等糖果的最小代價。數學轉換 這題其實是一道帶有濃厚數學色彩的貪心題。我們可以先用sum sumsu m來統計a i a i a i 之和,然後將s...
BZOJ1045 糖果傳遞(基於貪心的數學題)
點此看題面 大致題意 有 n 個小朋友坐成一圈,每人有 a i 個糖果。每人只能給左右兩人傳遞糖果,傳遞乙個糖果代價為1,求使所有人獲得均等糖果的最小代價。這題其實是一道帶有濃厚數學色彩的貪心題。我們可以先用 sum 來統計 a i 之和,然後將 sum 除以 n 從而求出最後每個小朋友應該擁有的糖...
BZOJ 1045 HAOI2008 糖果傳遞
有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞乙個糖果代價為1。第一行乙個正整數n 987654321,表示小朋友的個數 接下來n行,每行乙個整數ai,表示第i個小朋友得到的 糖果的顆數 求使所有人獲得均等糖果的最小代價。4 1254 4 結論題 設每個人剛開始有a...