1432:糖果傳遞(思維)

【題目描述】

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

【輸入】

第一行一個正整數n≤1000000,表示小朋友的個數.

接下來n行,每行一個整數ai,表示第i個小朋友得到的糖果的顆數.

【輸出】

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

【輸入樣例】

4
1
2
5
4

【輸出樣例】

4

我們將  a[i]  表示原來所擁有的糖 , x[i]  表示爲  i  傳遞的(正數表示得到,負數表示給出)

我們有  a[i] +  x[i]  +x[i-1]  =ave

所以有  x[i]  的遞推公式  ,只需要求x[i] 與某個  x[k]  之差的和最小即可

貪心考慮  x[i]  的中位數

#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
#define debug(a) cout<<"*"<<a<<"*"<<endl
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define s first
#define e second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> Pair;
const int inf=0x3f3f3f3f;
const int N=1e7+5;

    int n,m,t;
    int i,j,k;
    int a[N],x[N];

int main()
{
    IOS; string s;
    while(cin>>n){
        ll ave=0,ans=0;
        for(i=1;i<=n;i++){
            cin>>a[i];
            ave+=a[i];
        }
        ave/=n;
        for(i=1;i<=n;i++){
            x[i]=x[i-1]-a[i]+ave;
        }
        sort(x+1,x+1+n);
        int mid=n/2; if(n&1) mid++;
        mid=x[mid];
        for(i=1;i<=n;i++){
            ans+=abs(mid-x[i]);
        }
        cout<<ans<<endl;
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章