4262. 空调(acwing)

文章目录

  • 4262. 空调
    • 题目描述
    • 贪心+差分
      • 难点解析
        • 差分数组的更新
        • 计算最小命令数量
        • 更新差分数组
        • 反向差分计算
        • 计算最小指令数量

4262. 空调

题目描述

Farmer John 的 N头奶牛对他们牛棚的室温非常挑剔。

有些奶牛喜欢温度低一些,而有些奶牛则喜欢温度高一些。

Farmer John 的牛棚包含一排 N个牛栏,编号为 1…N,每个牛栏里有一头牛。

第 i头奶牛希望她的牛栏中的温度是 pi,而现在她的牛栏中的温度是 ti

为了确保每头奶牛都感到舒适,Farmer John 安装了一个新的空调系统。

该系统进行控制的方式非常有趣,他可以向系统发送命令,告诉它将一组连续的牛栏内的温度升高或降低 1个单位——例如「将牛栏 5…8的温度升高 1个单位」。

一组连续的牛栏最短可以仅包含一个牛栏。

请帮助 Farmer John 求出他需要向新的空调系统发送的命令的最小数量,使得每头奶牛的牛栏都处于其中的奶牛的理想温度。

输入格式
输入的第一行包含 N。

下一行包含 N 个非负整数 p1…pN,用空格分隔。

最后一行包含 N个非负整数 t1…tN

输出格式
输出一个整数,为 Farmer John 需要使用的最小指令数量。

数据范围
1≤N≤105,
0≤pi,ti≤10000
输入样例:

5
1 5 3 3 4
1 2 2 2 1

输出样例:

5

样例解释
一组最优的 Farmer John 可以使用的指令如下:

初始温度     :1 2 2 2 1
升高牛棚 2..5:1 3 3 3 2
升高牛棚 2..5:1 4 4 4 3
升高牛棚 2..5:1 5 5 5 4
降低牛棚 3..4:1 5 4 4 4
降低牛棚 3..4:1 5 3 3 4

贪心+差分

解析详见:AcWing 4262. 空调

#include<bits/stdc++.h> // 包含所有标准库头文件
using namespace std;    // 使用标准命名空间const int z=1e5+10;     // 定义常量z,表示最大的牛棚数量 + 10作为缓冲
int b[z];               // 定义一个全局数组b,用于存储每个牛棚的温度变化int main()              // 程序的主函数
{int n;             // 定义整数n,用于存储牛棚的数量scanf("%d",&n);    // 读入牛棚数量// 循环读入每个牛棚的期望温度for(int i=1;i<=n;i++) scanf("%d",&b[i]);// 循环读入每个牛棚的实际温度,并计算期望与实际的差值for(int i=1;i<=n;i++){int x;         // 定义临时变量x,用于存储每个牛棚的实际温度scanf("%d",&x); // 读入实际温度b[i]=b[i]-x;   // 计算差值,并更新b数组的相应位置}// 逆向差分,计算调整每个牛棚温度所需的命令数// 这是通过从后向前累计差值来实现的for(int i=n+1;i>=1;i--) b[i]=b[i]-b[i-1];int res=0;         // 定义结果变量res,初始化为0// 遍历b数组,累加所有正数差值// 正数差值表示需要升高温度的命令数for(int i=1;i<=n+1;i++){if(b[i]>0)    // 如果差值为正数res+=b[i]; // 累加到结果变量res}cout<<res<<endl;  // 输出最小指令数量return 0;         // 返回0,结束程序
}

这段代码的主要目的是计算Farmer John所需发送的最小指令数量,以便每头牛都处于其理想的温度。代码的核心思路是使用差分数组来跟踪每个牛棚的温度变化,于是问题转化为计算使数组b的所有值为0所需的最小操作数。

程序首先读入牛棚数量,然后读入每个牛棚的理想温度和实际温度。通过计算理想温度和实际温度的差值,并将这些差值存储在数组b中。随后,程序执行逆向差分,即从后向前累积差值,来计算必要的空调调整次数。最终,程序遍历整个差分数组,累加所有正数值,得到必要的最小指令数量。

请注意,由于温度调整的是连续区间,所以我们只需关心每个区间端点的温度变化即可。这是因为,当我们调整一个区间的温度时,区间内所有点的温度都会一起变化。因此,差分数组的作用在于帮助我们确定这些区间的边界。

难点解析

让我尽量解释得更清楚一些。代码的这部分利用了一种称为“差分”的技巧,来计算为了达到所有牛希望的温度而需要发送的空调调节命令的最小数量。这里的关键是理解“差分”和如何利用它来求解问题。

差分数组的更新
for(int i=n+1;i>=1;i--)b[i]=b[i]-b[i-1];

在这个循环中,我们实际上通过计算相邻元素之间的差值,来更新数组b。具体来说,这里的操作是将b[i]的值更新为b[i]b[i-1]的差。这一步的目的是为了反映从一个牛栏到另一个牛栏所需温度调整的净变化。

  • 为什么要这么做? 因为Farmer John的空调系统是通过升高或降低一组连续牛栏的温度来工作的。如果我们知道了连续两牛栏间所需的温度变化,那么我们就可以通过一系列这样的操作来确保每个牛栏的温度都调整到目标温度。
计算最小命令数量
int res=0;
for(int i=1;i<=n+1;i++)
{if(b[i]>0)res+=b[i];
}

在更新完差分数组后,接下来的步骤是计算发送给空调系统的最小命令数量。这里的策略是将差分数组中所有正的差分值加起来。为什么这样做?

  • 原因是,差分数组中的正值表示为了使牛栏的温度达到目标温度,我们需要增加温度的次数。而负值(如果直接处理)则表示需要降温的次数。但由于在最终计算中,需要增加温度的操作次数与需要降温的操作次数在数学上相互抵消,我们只需要关注增加温度的操作次数,因为这直接反映了操作的总数。具体来说,任何时候我们需要降低温度,都会有一个相对应的升温操作与之相抵消,因此,直接统计升温操作的次数就足够了。

这里的核心思想是,通过分别计算温度的增加和降低需求,然后找到满足这些需求的最小操作集,从而使得每个牛栏的温度都达到其希望的温度。通过这种方式,我们能够高效地找到解决方案。

当然,让我通过一个简单的例子来解释这段代码的逻辑。

假设我们有3个牛棚,Farmer John希望这些牛棚的温度分别为:

  • 牛棚1:希望温度为4度
  • 牛棚2:希望温度为5度
  • 牛棚3:希望温度为2度

目前,这些牛棚的实际温度分别为:

  • 牛棚1:实际温度为2度
  • 牛棚2:实际温度为3度
  • 牛棚3:实际温度为5度

首先,我们计算每个牛棚希望温度与实际温度之间的差异:

  • 牛棚1:差异为+2(需要升温2度)
  • 牛棚2:差异为+2(需要升温2度)
  • 牛棚3:差异为-3(需要降温3度)

接着,我们创建一个差分数组来帮助我们计算实现这些温度调整所需的最小指令数量。

更新差分数组

我们假设差分数组为b,并根据上面的差异更新它。这时,b中的值如下:

  • b[1]对应牛棚1的温度调整为+2
  • b[2]对应牛棚2的温度调整为+2
  • b[3]对应牛棚3的温度调整为-3
反向差分计算
for(int i=n+1;i>=1;i--)b[i]=b[i]-b[i-1];

这段代码实际上是在准备差分数组以便计算所需的最小操作。但是,为了简化理解,我们跳过这部分的具体计算,直接解释其作用:它帮助我们确定从一个牛棚到下一个牛棚,温度调整的净变化是多少。

计算最小指令数量

接下来,我们需要计算实现所有这些调整所需的最小指令数量。

int res=0;
for(int i=1;i<=n+1;i++)
{if(b[i]>0)res+=b[i];
}

在这个例子中,我们首先要增加温度以满足牛棚1和2的需求,然后降低温度以满足牛棚3的需求。简化计算,假设我们直接通过差分数组计算,结果如下:

  1. 升温2度以满足牛棚1的需求。
  2. 因为牛棚2也需要升温2度,所我们继续保持这个操作(实际上,这部分操作可能已经在差分数组计算中考虑过)。
  3. 最后,我们需要降温3度以满足牛棚3的需求。

简化的总结是,我们需要一系列升温和降温操作来达到目标状态。实际上,差分数组的计算和更新是为了找到这样一系列操作中的最小集合。

我希望这个例子能帮助理解较为抽象的差分更新和计算最小操作数的过程。实际上,代码中的逻辑更复杂,涉及预处理差分数组以便精确地计算出所需的最小操作数。

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

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

相关文章

MySQL数据库操作学习(1)

文章目录 一_初识MySQL数据库1、数据库2、数据库分类1.关系型数据库2.非关系型数据库&#xff08;备用&#xff09; 3、数据库概念1.数据&#xff08;data&#xff09;2.数据库&#xff08;database&#xff09;3.数据管理系统&#xff08;DBMS&#xff09; 二、MySQL库操作了解…

315曝光黑灰产业链:主板机

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 315晚会曝光主板机黑灰产业链&#xff0c;主板机是什么呢?可能很多人还不知道。在这里松松给大家普及一下&#xff0c;也欢迎大家关注卢松松哟! 主板机是什么呢? 通过报废手机的主板&#xff0c;拆出来后组装成主…

【XR806开发板试用】xr806 RTC实验

一、例程编译、烧录确认 首先按照全志在线文档平台的点灯教程确保能正常编译、烧录和点灯&#xff1a;https://xr806.docs.aw-ol.com/… 确保例程没问题后&#xff0c;我们再改造例程&#xff0c;实现我们想要的功能 二、代码编写 我们将hello工程复制一份改文件夹名为rtc_demo…

专升本 C语言笔记-06 常用的3种输入输出函数

1.scanf() 与 printf() 的使用 scanf() 格式化输入数据 格式:scanf("格式控制字符串",参数地址列表) scanf("%d,%d,%d",&a,&b,&c); printf("a %d\n",a); printf("b %d\n",b); printf("c %d\n",c); 注意 注…

【数据结构】堆

目录 一、树的介绍以及堆 1.树 2.二叉树以及堆 二、堆的实现 1.heap.h 2.heap.c 1)堆的初始化和销毁 2&#xff09; 堆的插入 3&#xff09;堆的删除 4&#xff09;取堆顶数据 5&#xff09;堆的数据个数 6&#xff09;堆的判空 3.test.c 一、树的介绍以及堆 …

跨境电商选品实战——Ownips公开数据信息安全采集+Python爬虫轻松搞定Lazada电商选品

文章目录 一、引言二、Lazada电商平台选品实战2.1、分析Lazada电商平台的商品列表接口2.2、定位商品列表计算逻辑2.3、封装高质量住宅IP2.4、运行爬虫 三、数据处理及选品分析四、Ownips——企业级全球静态住宅IP&#xff0c;高效采集公开数据 一、引言 互联网与外贸的结合&am…

Maya自定义工具架

有时候我们需要自己定义工具架上的内容&#xff0c;比如将一个工具放到工具架上&#xff0c;或者删除一个工具 添加一个工具 例如我们想在多边形建模栏位上添加一个分离按钮&#xff0c;默认 1 先切换到想要添加的工具架栏位 2 打开菜单&#xff0c;找到我们想添加的工具 …

前端实现websocket通信讲解(vue2框架)

websocket&#xff1a; WebSocket是HTML5下一种新的协议&#xff08;websocket协议本质上是一个基于tcp的协议&#xff09;它实现了浏览器与服务器全双工通信&#xff0c;能更好的节省服务器资源和带宽并达到实时通讯的目的Websocket是一个持久化的协议 websocket提供的api&a…

70城市房价同比继续下降

据北京商报的最新报道&#xff0c;昨&#xff08;3月15日&#xff09;天国家统计局发布《2月70个大中城市商品住宅销售价格》显示&#xff0c;2024年2月&#xff0c;在70个大中城市中&#xff0c;各线城市商品住宅销售价格同比继续下降。 一线城市二手住宅销售价格同比下降6.3…

拿捏指针(二)

个人主页&#xff1a;秋邱博客 所属栏目&#xff1a;C语言 &#xff08;感谢您的光临&#xff0c;您的光临蓬荜生辉&#xff09; 目录 前言 数组与指针 数组名的理解 指针数组与数组指针 指针数组 数组指针 数组传参 一维数组传参的本质 二维数组传参的本质 二维数组…

Github Gitlab SSH 密钥配置

1. 操作流程 生成密钥&#xff08;非对称加密&#xff09; ssh-keygen -t rsa -C "your_emailexample.com"注意&#xff0c;这里的 -C 表示注释&#xff0c;没有什么用&#xff0c;主要是标记密钥避免自己遗忘。 查看密钥&#xff08;公钥&#xff09; //进入所属…

Go 日期时间包装器:15条更便捷的时间处理

在Go编程中&#xff0c;处理日期和时间是一项常见任务&#xff0c;涉及到精确性和灵活性。尽管Go的标准库提供了时间包&#xff08;time&#xff09;用于处理时间相关操作&#xff0c;但在某些情况下&#xff0c;我们需要额外的实用函数来简化这些任务。本文将介绍一系列实用函…

RIPGeo参文31—36(关于对比学习):鼓励对同一数据点进行各种增强(视图),以学习更健壮的表示

RIPGeo中有: —干扰参数。在内部最大化中,我们提出了步骤,以增加损失的方向更新。我们的方法不是用简单的一步方案最大化内部部分,而是在每次迭代结束时将扰动投影到球面空间上(第2-7行),这允许模型产生更微妙但有价值的扰动[31]。 [31] A. Kurakin, I. J. Goodfellow…

代码随想录算法随想录day22 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

目录 二叉搜索树的最近公共祖先思路解题方法复杂度Code 二叉搜索树中的插入操作思路解题方法复杂度Code 删除二叉搜索树中的节点思路解题方法复杂度Code 总结 二叉搜索树的最近公共祖先 链接: 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共…

【智能硬件、大模型、LLM 智能音箱】MBO:基于树莓派、ChatGPT 的桌面机器人

MAKER:David Packman/译:趣无尽(转载请注明出处) 这是国外 Maker David Packman 制作的基于树莓派机器人 MBO,该机器人的外观设计灵感来自动漫 Adventure Time 中的机器人 MBO。它具有强大的交互功能,可实现脱机唤醒词检测、调用 ChatGPT 3.5 进行聊天、机器视觉对图像进…

京东云主机+京美建站SaaS版

京美建站SaaS版 京美建站搭建企业网站、小程序、3000精美模板 链接:https://daili.jd.com/s?linkNo57UBX34BZMWGNFYTOCPVUE7SN36CCIPKLTFLPCUCPYBKSYYBIPS2BJ57GP7RACLDHU66X526ZOULMIXL2VN7DT7IHU 京东云主机&#xff0c;安全稳定&#xff0c;性能强劲&#xff0c;新客下单…

(网络安全)一款强大的逆向分析工具,开源!

工具介绍 Ghidra 是由美国国家安全局&#xff08;NSA&#xff09;研究部门开发的软件逆向工程&#xff08;SRE&#xff09;套件&#xff0c;用于支持网络安全任务。包括一套功能齐全的高端软件分析工具&#xff0c;使用户能够在各种平台(Windows、Mac OS和Linux)分析编译后的代…

如何成为一名CCAA审核员?报名复习考试注册实习指南

一、管理体系审核员的注册领域 管理体系审核员包括质量管理体系&#xff08;QMS&#xff09;、环境管理体系&#xff08;EMS&#xff09;、职业健康安全管理体系&#xff08;OHSMS&#xff09;、食品安全管理体系&#xff08;FSMS&#xff09;、危害分析与关键控制点&#xff0…

一文带你了解神经网络是如何学习预测的

文章目录 1、GPT与神经网络的关系 2、什么是神经网络 3、神经网络是如何计算的 数据是如何输入到神经网络中的 神经网络是如何进行预测的 神经网络是如何进行学习的 4、小结 1、GPT与神经网络的关系 GPT想必大家已经耳熟能详&#xff0c;当我们与它进行对话时&#xff0c;通常…

Spring 被打暴了! vs Javalin vs Solon

测试仅供参考。不同的环境、场景&#xff0c;效果会不同。 测试记录&#xff1a; 项目SpringBoot2SpringBoot3JavalinSolon运行时java 17java 17java 17java 17测试前状态/内存101.1Mb112.9Mb66.1Mb45.6Mb测试后状态/内存996.3Mb326.9Mb457.3Mb369.2Mb测试后状态/并发2万2.6万…