#10010 「一本通 1.1 练习 6」糖果传递 (数学+贪心)
题目描述
原题来自:HAOI 2008
有 n个小朋友坐成一圈,每人有 ai 颗糖果。每人只能给左右两人传递糖果。每人每次传递一颗糖果的代价为 1 。求使所有人获得均等糖果的最小代价。
输入格式
第一行有一个整数 ,n表示小朋友个数;
在接下来 n行中,每行一个整数 。
输出格式
输出使所有人获得均等糖果的最小代价。
样例
样例输入
4
1
2
5
4
样例输出
4
数据范围与提示
对于 30% 的数据,n<1000;
对于100% 的数据,n<10^9,保证答案可以用64 位有符号整数存储。
题目链接:https://loj.ac/problem/10010
对于这道,emmmm据说是小学奥赛题,我看博客半小时才弄通,最后发现是自家会长的博客,O(∩_∩)O哈哈~
跪拜大佬:https://blog.csdn.net/qq_41890797/article/details/90244567
我对这道数学题的思路:
1.设未知数; 2.求公式;3.求中位数的负数;^_^ha大废话,显然觉的这道题有很多值得深入挖掘的性质,比如每个人最终的状态求个平均值就好了 。那么先不考虑算法(好像也不涉及算法),而是研究一波题面。
1.显然,代价的计算是一个麻烦的事情。我认为代价的计算应该是与路径有关,而不是与人有关。也就是说,我们关心的是两个人之间的路径上糖果移动的情况,可以设Xi:Ai—>Ai+1为糖果的路径转移。
2.我又发现,一条路径上糖果的移动方向只有一个,可以用正负来表示。接着我们还发现,只要知道了一条路径上糖果的移动情况,那么其他路径也是可以推出来的。
这时,公式已经出来了,也就是求出平均数然后列出每一条路径的糖果运送情况得到的,得到固定值Si的中位数,让Xn为中位数的相反数即可;
每人每次传递一个糖果代价为1
推公式过程
本题用到递推和贪心的算法思想,偏重对数学思维的检测。
(1).需要注意的题中条件:
<1>.首先要明确:n个人围成环坐;
<2>.只能左右传递;
<3>.使得每个人得到均等的饺子ave;
(2).找出递推式
<1>关注的每两个人之间的路径上饺子移动的情况。
<2> 设第i个人会给第i+1个人xi个糖果(带符号)即下图:那么 ai-xi+xi-1=ave;
1 2 3 4
初始值: 1 2 5 4
最终值: 3 3 3 3
移动情况:-2 -1 2 1
<3>将所有的式子列出来然后每一个做一个前缀和:那么xn−xi=∑ai−ave。
<5> 变形:xi=xn−(∑ai−ave)。((∑ai−ave)为一个常量,简写为k)
<4>找到递推式,要求∑|xi|最小实际上就是要求∑|xn−k|最小 。利用绝对值的几何意义,那么xn取这些常量k里的中位数时,愤怒值有最小值.
上代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int M=1e6+10;
int a[M],s[M];
int main()
{int n;ll sum=0;scanf("%d",&n);for(int i=1; i<=n; i++){scanf("%d",&a[i]);sum+=a[i];}ll ave=sum/n,ans=0;for(int i=1; i<=n; i++)s[i]=(a[i]-ave)+s[i-1];///减平均值后的前缀和sort(s+1,s+1+n);///为求中位数for(int i=1; i<=n; i++)ans+=abs(s[i]+(-s[(n+1)>>1]));///找(s[(n+1)>>1]为中位数)的负数printf("%lld\n",ans);return 0;
}
#10010 「一本通 1.1 练习 6」糖果传递 (数学+贪心)相关推荐
- #10003. 「一本通 1.1 例 4」加工生产调度(贪心)
加工生产调度 题目描述 某工厂收到了n个产品的订单,这n个产品分别在A.B两个车间加工,并且必须先在A车间加工后才可以到B车间加工. 某个产品i在A.B两车间加工的时间分别为Ai.Bi.询问怎样安排这 ...
- 「一本通 6.5 练习 3」迷路
「一本通 6.5 练习 3」迷路 题目描述 大意说一个给你有向图, 一个有n个节点,每个节点相连的边为所需要花费的时间, 问你从1到n 在时间刚好为t是的方案数.输出%2009 注意:不能在某个节点逗 ...
- 【C++】「一本通 1.1 例 4」加工生产调度
「一本通 1.1 例 4」加工生产调度 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1425 LibreOJ ...
- LibreOJ10082. 「一本通 3.3 例 1」Word Rings【二分+SPFA】
10082. 「一本通 3.3 例 1」Word Rings [题目描述] 传送门 [题解] 将一个字符串看成一条边,字符两端的字符看成节点,长度看成权值.二分枚举答案,最后SPFA刷正环,因为只要有 ...
- #10016. 「一本通 1.2 练习 3」灯泡(三分)
参考博客链接:「一本通 1.2 练习 3」灯泡(三分) #include<stdio.h> #include<string.h> #include<math.h> ...
- 【C++】「一本通 1.1 例 2」种树
「一本通 1.1 例 2」种树 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [解析] [代码] [来源] 一本通题库-1423 LibreOJ-10001 vjud ...
- #10001. 「一本通 1.1 例 2」种树
#10001. 「一本通 1.1 例 2」种树 满足n个区间种树的要求,求最少种多少棵数 思路 按照区间的尾巴来排序,因为如果区间有重叠的种在第一个区间的尾巴可以使得种树更少,所有每次始从尾巴开始种树 ...
- 【C++】「一本通 1.1 例 5」智力大冲浪
「一本通 1.1 例 5」智力大冲浪 [来源] [题目描述] [输入格式] [输出格式] [输入样例] [输出样例] [数据范围] [解析] [代码] [来源] 一本通题库-1426 LibreOJ- ...
- 「一本通 1.2 例 2」Best Cow Fences
题目链接: 链接: [link](信息学奥赛一本通(C++版)在线评测系统). 首先这道题要求找平均数,且要求所选片段长度需要大于等于l.那么首先想到的就是最暴力的方法就是找到所有大于等于l的片段在其 ...
最新文章
- 广东海洋大学体育馆管理系统 开发日记2
- 人工智能未来读后感 ----by RayKurzweil
- boost::mpl::abs相关的测试程序
- html往下滑变成水平,HTML - 水平滑块CSS最佳方法_html_开发99编程知识库
- SQLite学习手册
- 南京大学开源!ResT:高效Transformer架构!
- 第五节、矩阵分解之LU分解
- 抽象类、接口、内部类
- 使用.tar文件 升级cisco 3550 IOS
- 大数据做基础 构建流动人口健康屏障
- 10个基础且实用的C语言经典实例【附源码】
- 湖南职称计算机英语,湖南职称计算机考试哪里考,A,B,C,D各级别是怎么划分的...
- Iptable与firewalld防火墙
- Only fullscreen activities can request orientation终极解决方法
- Bussiness Card Design
- PTA 循环结构 7-3 简写转全称
- OneDrive登录失败解决办法
- 简洁的python复习(原创基础上有部分改动,持续更新)
- 异步(感应)电机概述
- 马斯克的这波神操作,让我意识到保持写代码的能力有多重要
热门文章
- Android插件化开发基础之Java反射机制研究
- git之Pushing to the remote branch is not fast-forward错误解决
- 实现html5音乐的自动播放,html5中audio实现播放列表和自动播放
- java数位倒置递归_有人能解释一下这个递归代码如何在java中反转int吗?
- filegetcontents php 返回值,php – file_get_contents没有返回任何数据
- 如何巧妙拒绝老同学借钱?哈哈哈哈哈......
- 深度学习框架PyTorch与TensorFlow,谁更胜一筹?
- TED演讲:区块链将如何改变世界?看完太震撼了!
- oracle12c考试内容,12c ocp考试内容
- bpmn如何查看代码 idea_提高程序员效率的IDEA插件推荐(五大神器)