zoukankan      html  css  js  c++  java
  • 【中位数 均分纸牌】 糖果传递

    传送门

    题意

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

    数据范围

    (1leq 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<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define rep(i,a,n) for(int i=a;i<n;i++)
    const int N=1e6+10;
    ll a[N],s[N];
    int n;
    int main()
    {
        scanf("%d",&n);
        ll sum=0;
        rep(i,1,n+1) scanf("%lld",&a[i]),sum+=a[i];
        ll avg=sum/n;
        rep(i,1,n+1) a[i]-=avg;
        rep(i,1,n+1) s[i]=s[i-1]+a[i];
        sort(s+1,s+n+1);
        ll ans=0;
        ll mid=s[n+1>>1];
        sort(s+1,s+n+1);
        rep(i,1,n+1) ans+=abs(s[i]-mid);
        printf("%d
    ",ans);
    }
    
    
  • 相关阅读:
    Java--数组转成list,list转数组
    js禁用后退
    正则
    实用符号Alt+小键盘快输
    Minimum Depth of Binary Tree
    Balanced Binary Tree
    Valid Palindrome [leetcode]
    Sum Root to Leaf Numbers
    reorder List
    判断链表 有环
  • 原文地址:https://www.cnblogs.com/hhyx/p/13287138.html
Copyright © 2011-2022 走看看