糖果传递问题(超详细的数论公式推导+贪心结论+均分问题)

news2025/1/13 6:05:06

糖果传递问题

文章目录

  • 糖果传递问题
    • 问题描述
    • 问题分析【公式推导过程】
    • 代码

问题描述

有 n 个小朋友坐成一圈,每人有 a[i] 个糖果。
每人只能给左右两人传递糖果。
每人每次传递一个糖果代价为 1。
求使所有人获得均等糖果的最小代价。

输入格式
第一行输入一个正整数 n,表示小朋友的个数。

接下来 n 行,每行一个整数 a[i],表示第 i 个小朋友初始得到的糖果的颗数。

输出格式
输出一个整数,表示最小代价。

数据范围
1≤n≤1000000,
0≤a[i]≤2×109,
数据保证一定有解。

输入样例:
4
1
2
5
4
输出样例:
4

问题分析【公式推导过程】

话不多说,直接看图:我们令小朋友数组是a[N],给出的是数组x[N],这里的x可以是正数或者负数,正数代表给出,负数代表索取。
这里要求解的答案就是 |x1|+|x2|+|x3|+..... +|xn|的最小值
在这里插入图片描述
那么我们可以得到如下规律:
在这里插入图片描述
好了,我们现在尝试用x1来表示x2,x3,x4…,有如下的推导公式:
在这里插入图片描述
为啥会有个特殊式子产生呢?----因为这是一个环,我们要将这个环拉成一条直线。
寻找线型关系,所以对这个选项忽略掉。

我们将 1式 + 2式 有x3=x1-(a1+a2-2a);
同理,将 1式 + 2式 + 3式有x4=x1+(a1+a2+a3-3a);
按照这个规律地推下去,我们就可以用x1来表示x2,x3,x4
得出的结论如下:
在这里插入图片描述
回到最初的结论:

这里要求解的答案就是 |x1|+|x2|+|x3|+..... +|xn|的最小值

我们可以将划红线的数值看成点,就是仓库选址的结论,若n 为奇数,那么最小选点就是中间点n>>1+1,若n是偶数,则是n>>1 ,n>>1+1都可以

这些点也有特征:

int ava=sum/n;
    for(int i=2;i<=n;i++){
        s[i]=s[i-1]+a[i-1]-ava;//ava是平均数
    }

代码

#include<algorithm>
#include<iostream>
using namespace std;
const int N =1e6 + 7;
int a[N],s[N],n;
typedef long long LL;
LL sum,res;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    int ava=sum/n;
    for(int i=2;i<=n;i++){
        s[i]=s[i-1]+a[i-1]-ava;//ava是平均数
    }
    sort(s+1,s+n+1);
    int mid=s[(n>>1)+1];
    for(int i=1;i<=n;i++){
        res+=abs(mid-s[i]);
    }
    cout<<res<<endl;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1030104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【2】贪心算法-综述

前言 从前&#xff0c;有一个很穷的人救了一条蛇的命&#xff0c;蛇为了报答他的救命之 恩&#xff0c;于是就让这个人提出要求&#xff0c;满足他的愿望。这个人一开始只要求简 单的衣食&#xff0c;蛇都满足了他的愿望&#xff0c;后来慢慢地贪欲升起&#xff0c;要求做官&am…

基于SSM的出租车管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

智荟康午休课桌椅成为第十届中国慈善展览会公益亮点产品

第十届中国慈善展览会&#xff08;以下简称“慈展会”&#xff09;于9月15日至17日在深圳会展中心隆重举办&#xff0c;此次展会为期3天&#xff0c;主要围绕“共建现代化慈善&#xff0c;聚力高质量发展”的主题&#xff0c;重点聚焦聚力民生福祉&#xff0c;将打造“一展多元…

新手小白如何学习自动化测试?

前言 测试自动化在各个行业和应用中被广泛使用&#xff0c;并产生巨大的效果。软件开发方法&#xff0c;如DevOps、Agile、Waterfall和它们的不同风格&#xff0c;广泛使用测试自动化来降低成本&#xff0c;提高效率和准确性&#xff0c;并加快回归测试。 测试自动化是在充分…

LeetCode 75 - 01 : 最小面积矩形

type pair struct{x, y int }func minAreaRect(points [][]int)int{mp : map[pair]struct{}{}// 将二维数组中的坐标映射到map中for i : range points{mp[pair{points[i][0], points[i][1]}] struct{}{}}// 将结果设置为一个最大值&#xff0c;防止影响求最小值的逻辑res : ma…

学习记忆——宫殿篇——记忆宫殿——记忆桩——工人宿舍

脸盆铁盒白色泡沫绳子电热炉 6. 椅子 7. 门帘 8. 塑料 9. 书 10.安全帽 11. 凳子 暖壶烟灰缸计算器水杯刷子

【GPU编程】Visual Studio创建基于GPU编程的项目

vs创建基于GPU编程的项目 &#x1f34a;前言&#x1f438;方法一-CUDA Runtime生成&#x1f61d;debug设置 &#x1f345;方法二-空项目配置&#x1f349;&#x1f349;&#x1f349;代码验证 &#x1f34a;前言 cuda以及cudnn的安装以及系统环境变量的配置默认已经做完。如果…

七天学会C语言-第六天(指针)

1.指针变量与普通变量 指针变量与普通变量是C语言中的两种不同类型的变量&#xff0c;它们有一些重要的区别和联系。 普通变量是一种存储数据的容器&#xff0c;可以直接存储和访问数据的值。&#xff1a; int num 10; // 定义一个整数型普通变量num&#xff0c;赋值为10在例…

【算法训练-二叉树 四】【对称与翻转】对称二叉树、翻转二叉树

废话不多说&#xff0c;喊一句号子鼓励自己&#xff1a;程序员永不失业&#xff0c;程序员走向架构&#xff01;本篇Blog的主题是【二叉树的形态变化】&#xff0c;使用【二叉树】这个基本的数据结构来实现&#xff0c;这个高频题的站点是&#xff1a;CodeTop&#xff0c;筛选条…

后端思维:通过代码去重,做一个后端通用模板

目录 后端思维 1. 优化前的例子 2. 抽取公用方法去重 3. 反射对比字段 4.Lambda函数式泛型 5. 继承多态. 6. 模板方法 6.1 定义对比模板的骨架 6.2 模板的方法逐步细化 6.3 不同对比子类 7. 工厂模式 模板方法 策略模式全家桶 最后 后端思维 最近工作中,我通过层层…

学Python的漫画漫步进阶 -- 第十二步.文件读写

学Python的漫画漫步进阶 -- 第十二步.文件读写 十二、文件读写12.1 打开文件12.2 关闭文件12.2.1 在finally代码块中关闭文件12.2.2 在with as代码块中关闭文件 12.3 读写文本文件12.4 动动手——复制文本文件12.5 读写二进制文件12.6 动动手——复制二进制文件12.7 练一练12.8…

Redis之list类型

文章目录 Redis之list类型1. 列表添加/弹出元素2. 查看列表3. 获取列表中元素的个数4. 删除列表中指定的值5. 获取/指定元素的值6. 向列表中插入元素7. 删除指定索引范围之外的所有元素8. 将元素从一个列表转移到另一个列表9. 应用场景9.1 队列9.2 类似微信上订阅公众号&#x…

MidJourneyAI绘画之月满中秋情更浓

皓月当空照人间&#xff0c; 银河洒满天幕间。 嫦娥轻舞婵娟态&#xff0c; 桂香飘散诗意添。 团圆乐享如意时&#xff0c; 家人相聚笑声吹。 中秋欢庆如诗意&#xff0c; 祝福平安好运气。

从网约车平台合规问题看企业合规难题如何破解

随着互联网的快速发展&#xff0c;网约车行业逐渐崛起并成为人们出行的重要选择之一。然而&#xff0c;虽然网约车平台带来了便利和效率&#xff0c;但也引发了一系列合规问题。 近日&#xff0c;西安市交通运输综合执法支队和西安市出租汽车管理处组织开展了西安市网约车行业…

Leetcode 95. 不同的二叉搜索树 II

文章目录 题目代码&#xff08;9.21 首刷看解析&#xff09; 题目 Leetcode 95. 不同的二叉搜索树 II 代码&#xff08;9.21 首刷看解析&#xff09; class Solution { public:vector<TreeNode*> generateTrees(int n) {return build(1,n);}vector<TreeNode*> bu…

singularity docker 拉取镜像 seurat和scapy spatial空转数据转换 cell2location

JiekaiLab/scDIOR: scDIOR: Single cell data IO softwaRe (github.com) module availablemodule load singularitysingularity pull docker://jiekailab/scdior-image:Seuratv4_Scanpy1.8 export PATH/seu_share/apps/singularity/bin/singularity:$PATH

C++数据结构题:DS 顺序表--连续操作

建立顺序表的类&#xff0c;属性包括&#xff1a;数组、实际长度、最大长度&#xff08;设定为 1000 &#xff09; 该类具有以下成员函数&#xff1a; 构造函数&#xff1a;实现顺序表的初始化。 插入多个数据的 multiinsert(int i, int n, int item[]) 函数&#xff0c;实…

vue 脚手架 入门 记录

vue 脚手架 入门 记录 以管理员身份运行PowerShell执行&#xff1a;get-ExecutionPolicy&#xff0c;回复Restricted&#xff0c;表示状态是禁止的 3.执行&#xff1a;set-ExecutionPolicy RemoteSigned 4.选择Y 注意&#xff1a;一定要以管理员的身份运行PowerShell&#xff…

Verilog功能模块——标准FIFO转FWFT FIFO

前言 在使用FIFO IP核时&#xff0c;我更喜欢使用FWFT(First Word First Through) FIFO而非标准FIFO&#xff0c;FWFT FIFO的数据会预先加载到dout端口&#xff0c;当empty为低时数据就已经有效了&#xff0c;而rd_en信号是指示此FIFO更新下一个数据&#xff0c;这种FWFT FIFO的…

【Linux基础】第30讲 Linux用户和用户组权限控制命令(二)

1&#xff09;sudo命令 sudo是Linux系统管理指令&#xff0c;是允许系统管理员让普通用户执行一些或者全部的root命令的一个工具&#xff0c;如halt,reboot,su等等&#xff0c;这样不仅减少了root用户的登录和管理时间&#xff0c;同样也提高了安全性。 2&#xff09;修改配置…