【中位数 均分纸牌】 糖果传递

题意

传送门
\(N\)个人围成环形,每个人都有一定数量的糖果\(A_{i}\),每个人可以左右传递,
代价为\(1\),求让所有人的糖果数量相等所需要的最小操作数

数据范围

\(1\leq N \leq 10^{6}\)

题解

环形均分纸牌即选取某一个点,将环断开,进行均分纸牌的过程假设从第\(k\)个点出断开
那么变成了\(A_{k+1}, A_{k+ 2}, \ldots, A_{N}, A_{1}, \ldots, A_{k}\)
前缀和为\(S_{k+1}-S_{k}, S_{k+2}- S_{k}, \ldots, S_{N}-S_{k}, S_{1}+S_{N}-S_{k}, \ldots, S_{N}\)
其中\(S_{N}=0\)恒成立,所以就是求一个\(k\)使得\(\sum_{i=1}^{N}|S_{i}-S_{k}|\)最小
考虑方式同货仓选址,即中位数是最小操作

Code

#include
using namespace std;
#define ll long long
#define rep(i,a,n) for(int i=a;i>1];
    sort(s+1,s+n+1);
    rep(i,1,n+1) ans+=abs(s[i]-mid);
    printf("%d\n",ans);
}

你可能感兴趣的:(【中位数 均分纸牌】 糖果传递)