BZOJ 1045 糖果傳遞 數學 遞推

2022-05-20 09:43:50 字數 1536 閱讀 9234

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