UVA 11300 Spreading the Wealth
2016-01-13 22:06
295 查看
UVA - 11300
分金币问题,大白书上的一道题,具体的过程第一次看的感觉很神奇,后来边看边想,确实这个中位数求的很有道理。
这道题通过建模列n个方程,可以抽象成给定数轴上n个点,在数轴上的所有点中,中位数离所有点的距离之和最小。
想了想,假设最优点向中位数点左侧移动d距离,那么原来在左边的点距离之和减去a个d,原来在右边的点距离之和加上a个d.总距离不变。但是中位数和最优点之间的距离变大。所以当最优点就是中位数的时候,最优点和中位数的距离为0.达到最优。
注意这题要用long long和%lld.我用int没过,用%I64d也没过。
分金币问题,大白书上的一道题,具体的过程第一次看的感觉很神奇,后来边看边想,确实这个中位数求的很有道理。
这道题通过建模列n个方程,可以抽象成给定数轴上n个点,在数轴上的所有点中,中位数离所有点的距离之和最小。
想了想,假设最优点向中位数点左侧移动d距离,那么原来在左边的点距离之和减去a个d,原来在右边的点距离之和加上a个d.总距离不变。但是中位数和最优点之间的距离变大。所以当最优点就是中位数的时候,最优点和中位数的距离为0.达到最优。
注意这题要用long long和%lld.我用int没过,用%I64d也没过。
#include<stdio.h> #include<algorithm> #define N 1000005 using namespace std; long long a ,b ; int n; int main() { while(scanf("%d",&n)>0) { long long sum=0; for(int i=1;i<=n;i++) { scanf("%lld",&b[i]); sum+=b[i]; } long long m=sum/n; a[0]=0; for(int i=1;i<n;i++) a[i]=a[i-1]+b[i]-m; sort(a,a+n); long long middle=a[n/2],ans=0; for(int i=0;i<n;i++) ans+=abs(middle-a[i]); printf("%lld\n",ans); } return 0; }
相关文章推荐
- IOS 打印素数与计算天数
- <compilation debug="true" targetFramework="4.5"> 报错解决方案
- C Primer Plus(第五版)10
- Windows镜像安装时选择系统版本
- JS截取字符串常用方法详细整理
- 详解如何实现定义一个参数个数可变的函数
- Unity Toast插件(UGUI版)
- 6、数组
- java第一天
- SQLdiag-配置文件-扩展
- lintcode:最长上升子序列
- Windows开启NTP服务
- 寒假第二弹之莫比乌斯反演
- 【年终总结】畅途网
- 关于浮点数转换为整数的测试
- 初窥c++11:lambda函数及其用法
- iOS开发中图片的一些处理操作(背景色,透明度,合成,大小)
- 用树莓派DIY天气检测站
- linux:英文界面转中文
- IAR-项目目录与头文件目录