ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[LG4016] 负载平衡问题

2019-06-16 08:54:47  阅读:234  来源: 互联网

标签:right 纸牌 int 负载平衡 sum 问题 均分 LG4016 id


题意

在网络流 24 题中隐藏的环形均分纸牌问题

分析

考虑普通均分纸牌问题

第 \(i\) 个人有 \(a_i\) 张牌,总牌数为 \(sum=\sum_{i=1}^na_i\),均分下来的牌数为 \(T=\frac{sum}{n}\).

于是每个人与平均值的差为 \(d_i= T-a_i\). 如果要让 \(a_i\) 变成 \(T\),就让 \(a_i+=d_i,a_{i+1}-=d_i\).

所以令 \(s_i=\sum_{j=1}^id_j\),表示第 \(i\) 个人的吞吐量,那么让前 \(k\) 个人变成 \(T\) 的分牌次数为 \(\sum_{i=1}^k|s_i|\).

这是一个定值

考虑环形均分

环形中,必存在 \(k\in[1,n],a_k\leq T,a_{(k+1)\bmod n}\geq T\).

因此前者从前面获得纸牌,后者向后面推送纸牌

于是破环为链计算即可

于是双倍一下

那么第 \(k+1\) 到 \(k+n\) 的均分数为
\[ \begin{split} &\sum_{i=k+1}^{k+n}\left|\sum_{j=k+1}^id_j\right|\\ =&\sum_{i=k+1}^{k+n}\left| \sum_{j=1}^id_j- \sum_{j=1}^kd_j \right|\\ =&\sum_{i=k+1}^{k+n}\left| s_i-s_k \right|\\ \end{split} \]

代码

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=200;
int n,sum,t,ans=0x3f3f3f3f;
int a[N*2],d[N*2],s[N*2],g[N*2];
int abs(int x){return x>0?x:-x;}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),sum+=(a[i+n]=a[i]);
    t=sum/n;
    for(int i=1;i<=n*2;i++)d[i]=t-a[i];
    for(int i=1;i<=n*2;i++)s[i]=s[i-1]+d[i];
    for(int i=1;i<=n;i++){
        int tot=0;
        for(int j=1;j<=n;j++)tot+=abs(s[i+j]-s[i]);
        ans=min(ans,tot);
    }
    printf("%d",ans);
    return 0;
}

标签:right,纸牌,int,负载平衡,sum,问题,均分,LG4016,id
来源: https://www.cnblogs.com/sshwy/p/11029576.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有