博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【bzoj1045】[HAOI2008] 糖果传递
阅读量:4464 次
发布时间:2019-06-08

本文共 1080 字,大约阅读时间需要 3 分钟。

环形均分纸牌问题。用A[i]表示糖果数,sum表示目标的糖果数量。用X[i]表示从i + 1移动到i的糖果的个数(可+可-)。由此可以得到式子A[i] + X[i] - X[i - 1] = sum。我们可以得到这样的n - 1个方程(第n个可以由前n - 1个推导)。但是这样不足以求解。我们进行以下变形:

A[2] + X[2] - X[1] = sum => X[2] = X[1] + sum - A[2]
A[3] + X[3] - X[2] = sum => X[3] = X[2] + sum - A[3] = X[1] + (sum - A[2]) + (sum - A[3])
设W[1] = 0, W[2] = A[2] - sum, W[i] = W[i - 1] + A[i] - sum,则 X[i] = X[1] - W[i]
所以Ans = sigma (|X[1] - W[i]|), 1 <= i <= n
而这个式子的几何意义是找一个点,使得这个点到W[i]所对应的每一个点的距离的和最小。所以X[1]应该取W[i]的中位数。

 

#include
#include
#include
#include
#include
#include
#include
using namespace std; typedef long long LL; #define MAXN 1000010 int a[MAXN],c[MAXN];int n;LL sum,ans; int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); sum+=a[i]; } sum/=n; for (int i=2;i<=n;i++) c[i]=c[i-1]+a[i]-sum; sort(c+1,c+n+1); int m=c[n>>1|1]; for (int i=1;i<=n;i++) ans+=abs(c[i]-m); printf("%lld",ans); return 0;}

 

转载于:https://www.cnblogs.com/yangjiyuan/p/5343100.html

你可能感兴趣的文章
MySQL学习笔记
查看>>
面试题
查看>>
DS博客作业08-课程总结
查看>>
利用Python爬虫刷店铺微博等访问量最简单有效教程
查看>>
浅谈软件测试与墨菲定律
查看>>
文件安全复制之 FastCopy
查看>>
强烈推荐美文之《从此刻起,我要》
查看>>
敏捷开发流程
查看>>
leetcode 412. Fizz Buzz
查看>>
对Netflix Ribbon的Loadbalancer类源码设计合理性的一点质疑
查看>>
关于日历的算法
查看>>
[QT编程]QT实现的一个渐隐渐显窗体
查看>>
在Web工程中引入Jquery插件报错解决方案
查看>>
大学总结之影响我最深的十本书
查看>>
用myEclipse连接数据源生成动态数据报表
查看>>
[myeclipse]@override报错问题
查看>>
자주 쓰이는 정규표현식
查看>>
超简单的listview单选模式SingleMode(自定义listview item)
查看>>
vue-11-路由嵌套-参数传递-路由高亮
查看>>
HDU 1199 - Color the Ball 离散化
查看>>