非常好的一道数学题。

原题链接(洛谷)

原题链接(UVa)

题目分析

(参考刘汝佳《算法竞赛入门经典 ⋅\cdot⋅ 训练指南》)

本身看起来很复杂。不要急,我们慢慢分析。

首先,每个人最终的金币数是可以计算出来的,即总金币数去除以总人数,我们设这个数等于MMM。

假设一共有 nnn 个人,编号为 111,222,333,444,⋯\cdots⋯。设每个人刚开始拥有的金币数为 AiA_iAi​,xix_ixi​ 表示第 iii 个人给其上一个人的金币数(x1x_1x1​ 表示给 nnn 的金币数)。那么对于编号 111,经转手后的金币数就等于 M=A1−x1+x2M=A_1-x_1+x_2M=A1​−x1​+x2​,同理:M=A2−x2+x3,M=A3−x3+x4⋯M=A_2-x_2+x_3,M=A_3-x_3+x_4\cdotsM=A2​−x2​+x3​,M=A3​−x3​+x4​⋯。最终我们就可以获得第 nnn 个式子 M=An−xn+x1M=A_n-x_n+x_1M=An​−xn​+x1​,那我们是不是就可以解方程组了呢?很遗憾,最后一个方程是可以通过前 n−1n-1n−1 个方程推导出来的,故只有前 n−1n-1n−1 个方程是有用的。

尽管无法直接求解,我们还是可以用 x1x_1x1​ 表示其他的 xix_ixi​,进而转化为单变量的极值问题。

对于第 111 个人,可以得到 x2=x1+M−A1x_2=x_1+M-A_1x2​=x1​+M−A1​。

对于第 222 个人,可以得到 x3=x2+M−A2=x1+M−A2+M−A1x_3=x_2+M-A_2=x_1+M-A_2+M-A_1x3​=x2​+M−A2​=x1​+M−A2​+M−A1​。

对于第 333 个人,可以得到 x4=x3+M−A3=x1+M−A3+M−A2+M−A1x_4=x_3+M-A_3=x_1+M-A_3+M-A_2+M-A_1x4​=x3​+M−A3​=x1​+M−A3​+M−A2​+M−A1​。

⋯\cdots⋯

所以对于第 nnn 个人,有 xn=x1+nM−(∑i=1nAi)x_n=x_1+nM-(\sum_{i=1}^nA_i)xn​=x1​+nM−(∑i=1n​Ai​)。

最后,我们要求解的是转手金币数的最小值,也就是 min⁡{∑i=1n∣xi∣}\min\{\sum_{i=1}^n|x_i|\}min{∑i=1n​∣xi​∣},所以这个时候我们令 Ci=(∑i=1nAi)−i⋅MC_i=(\sum_{i=1}^nA_i)-i\cdot MCi​=(∑i=1n​Ai​)−i⋅M,这样,我们要求解的式子就变成 min⁡{∣x1∣+∣x1−C1∣+∣x2−C2∣+⋯+∣xn−Cn∣}\min\{|x_1|+|x_1-C_1|+|x_2-C_2|+\cdots +|x_n-C_n|\}min{∣x1​∣+∣x1​−C1​∣+∣x2​−C2​∣+⋯+∣xn​−Cn​∣}。由于两个值的差的绝对值的几何意义是二者的距离,所以我们把求最小值这个问题放在数轴上来解决,问题也转成求 x1x_1x1​ 到各个 CiC_iCi​ 的距离之和的最小值。

假设我们的红圈(x1x_1x1​)向右微微移动了 ddd 个单位,那么对于左边就增加了 2d2d2d 的距离,对于右边减少了 4d4d4d 的距离,故减少了 2d2d2d 的距离。所以每次只要我们向蓝圈更多的一边去移动,就会对答案产生贡献,进而推出当红圈两边的蓝圈数相等,即处于中位数时,可以获得最小值。之后我们将 CiC_iCi​ 从小到大来排序,然后统计答案即可。

对于 AiA_iAi​,我们没有任何必要保存,具体实现请看代码:

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
using namespace std;
ll M,sum;
int n;
ll C[1000005];inline ll re(){register ll k=0,f=1ll;register char c=getchar();while(!isdigit(c)){if(c=='-') f=-1ll;c=getchar();}while(isdigit(c)){k=k*10ll+(c^48ll);c=getchar();}return 1ll*k*f;
}void wr(ll x){if(x<0){x=~x+1;putchar('-');}if(x>9) wr(x/10ll);putchar(x%10ll^48ll);
}signed main(){while(scanf("%d",&n)!=EOF){for(int i=1;i<=n;++i) C[i]=0;for(int i=1;i<=n;++i){ll x=re();C[i]=x+C[i-1];}M=C[n]/n;for(int i=1;i<=n;++i) C[i]-=i*M;sort(C+1,C+1+n);ll x=C[(n+1)/2],ans=0;for(int i=1;i<=n;++i)ans+=abs(x-C[i]);wr(ans);putchar('\n');}return 0;
}

UVa11300 Spreading the Wealth 题解相关推荐

  1. UVA11300 Spreading the Wealth

    UVA11300 Spreading the Wealth 思路  对于这道题,我们可以将其转化为一道线性代数的问题,设第iii个人的初始值为AiA_{i}Ai​,第iii个人给第i−1i-1i−1个 ...

  2. UVa11300 - Spreading the Wealth

    题意 n个人围成一圈,每个人都有一定数量的金币,金币总数可被n整除,现可将手中金币给左右相邻的人,最终使每人手中的金币数相等,求最少转移的金币数量. 思路 设a[i]给了a[i-1]x1个金币,从a[ ...

  3. UVa11300 Spreading the Wealth(数学问题)

    题意:给出n个人,每个人有一些金币,可以给一些金币左边或者右边的人,最终使得每个人有相同的金币,问最小的转移金币是多少? 思路:可以假定给金币方向是逆时间方向,值可能是正负.M表示最终每个人有的金币, ...

  4. UVA11300 Spreading the Wealth 分金币 C++ (数学推导)

    参考算法竞赛入门经典训练指南 /* 最后每个人的金币:M = (A1+A2+...+An)/n(设当前每个人的金币为Ai) 设xi表示i给i+1传递给了xi个金币(xn表示n给1传递了xn个金币) 为 ...

  5. 题解 UVA - 11300 Spreading the Wealth

    题解 UVA - 11300 Spreading the Wealth 1:题意 A Communist regime is trying to redistribute wealth in a vi ...

  6. UVA - 11300 Spreading the Wealth 中位数,递推

    UVA - 11300 Spreading the Wealth 题意: 有n个人,每个人都有一些钱,每个人都可以把任意的钱分给左右相邻的两个人(第一个人可以把钱分给第二个人和第 n 个人),求最少需 ...

  7. 11300 - Spreading the Wealth

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  8. Spreading the Wealth( UVA - 11300)

    题目链接: Spreading the Wealth UVA - 11300 Problem A Communist regime is trying to redistribute wealth i ...

  9. UVa 11300 Spreading the Wealth

    注意:给定数轴上的n 个点,在数轴上的所有点中,中位数离所有顶点的距离之和最小.  F. Spreading the Wealth  Problem A Communist regime is try ...

最新文章

  1. python pip 安装报错 error in setup command: use_2to3 is invalid. 解决方法
  2. 在线网站原型设计工具Cacoo
  3. Linux网络协议栈(三)——网络设备(1)
  4. 我混了大半辈子,忽然成了拆二代
  5. python 解析模块脚本_Python HTMLParser模块解析html获取url实例
  6. php正则可以实现模糊匹配,正则表达式的模糊匹配功能如何实现
  7. 大数据基础课02 从萌芽到爆发,大数据经历了哪些发展?
  8. Android 运行时权限检测流程,申请危险权限组权限代码
  9. 其实我们可以做自己的心理医生
  10. 服务器怎么做无限耐久装备,饥荒物品无限耐久控制台指令 | 手游网游页游攻略大全...
  11. 音频焦点(AudioFocus)应用与源码解析
  12. 学习HTTP协议——《图解HTTP》
  13. 科创人·36氪副总裁王坤:企服产品应重视使用者体验,36氪将推出中国版「魔力象限」
  14. org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Mav
  15. mysql c bold转text_(转)MySQL字段类型
  16. 零基础入门天池NLP赛事之——新闻文本分类(5)
  17. mysql设置约束大于0_MySQL约束
  18. mac连接蓝牙耳机自动打开iTunes问题解决
  19. 论文阅读 (84):A GAN-based Algorithm for Multi-Instance Multi-Label Learning on Overlapping Signal Wavefo
  20. 低通滤波器算法LPF的python图像化验证

热门文章

  1. 【H5】自己写了个仿360商城demo,欢迎大虾路过拍砖
  2. 阿里大鱼短信平台使用-Java版
  3. 计算机专业毕业鉴定,计算机专业毕业生自我鉴定
  4. Cocos2d-x-Lua示例项目HelloLua
  5. 目标检测YOLO实战应用案例100讲-基于激光雷达的智能汽车多目标检测与跟踪方法研究
  6. 无人机航空摄影测绘技术有哪些优势?
  7. 网络安全自学笔记08 - Linux之shell
  8. 推荐的截图工具,超级好用的几款小工具
  9. ca证书 csr_CSR文件在线验证工具
  10. mysql谓词_MySQL 子查询谓词