【C++ 差分数组 前后缀分解】P7404家庭菜园

本文涉及知识点

C++差分数组
C++前后缀分解

P7404家庭菜园

出自洛谷,我简述一下。
已知数组a,长度为n(1<=n<=2e5),1 <=a[i] <=1e9。一次操作如下:将a[i…j]全+1。问最少操作多少次,使得a成为山形数组,即存在k,a[0…k]严格递增,a[k…]严格递减。

前后缀分解+差分数组(错误解法)

n = a.length
pre[i]记录将a长度为i的前缀转成严格递增需要的最少次数,np[i]记录此时a[i-1]的值。
suff[i]记录将a长度为i的后缀转成严格递减需要的最少次数,ns[i]类似np。可以转化成a的转置数组的前缀。
从0到n,枚举i。j = N-i。
如果np[i]== ns[i],则转成 左半长为i的山形数组需要的操作次数为:pre[i]+suff[j]+1
否则,转成左半长为i或i+1的山形数组需要的操作次数为:pre[i]+suff[i]。前缀的最后一个元素和后缀的第一个元素,谁大谁是山顶。

如何求前缀递增的次数

pre[0] = 0
如果a[i] > a[i-1] 不需要操作。 否则 a[i…]都操作 a[i-1]+1-a[i]次。
为什么选择a[i…]而不是a[i…j],如果后置是严格递增,前者也是。
由于a[i]后面的元素都增加了相同的数,所以后面的a[i]-a[i-1]都不变。
即求差分数组为正元素之和。
错误原因:{2,1,4,1,2} 直接将{2,1,4}提升两次。

正确解法

左边的操作是:[x1…i]加一,右边的操作是[ i…x2] ,一定可以合并成[x1 ⋯ \cdots x2]
i从1到n
令 j = n+1- i,cur = max(pre[i],suff[j])

代码

核心代码

#include <iostream>
#include <sstream>
#include <vector>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<string>
#include<algorithm>
#include<functional>
#include<queue>
#include <stack>
#include<iomanip>
#include<numeric>#include <bitset>
using namespace std;class Solution {public:long long Cal(const vector<int> a) {auto PreSum = [](const vector<int>& nums) {vector<long long> ret = { 0,0 };			for (int i = 1; i < nums.size(); i++) {const int iAdd = max(0,nums[i - 1]+1 - nums[i]);ret.emplace_back(ret.back() + iAdd);}return ret;};auto preSum = PreSum(a);auto suff = PreSum( vector<int>(a.rbegin(), a.rend()));long long  ret = 2e18;for (int i = 1; i <= a.size(); i++) {const int j = a.size()+1 - i;const auto cur = max(preSum[i],suff[j]);ret = min(ret, cur);}return ret;}};int main() {//freopen("./a.in", "r", stdin);//freopen("./output.txt", "a", stdout);int N;scanf("%d", &N);vector<int> a(N );	for (int i = 0; i < N; i++) {scanf("%d", &a[i]);}	auto res =  Solution().Cal(a);printf("%lld", res);return 0;
}

单元测试

vector<int> a;TEST_METHOD(TestMethod1){a = {1 };auto res = Solution().Cal(a);AssertEx(0LL, res);}TEST_METHOD(TestMethod2){a = { 1,2 };auto res = Solution().Cal(a);AssertEx(0LL, res);}TEST_METHOD(TestMethod3){a = { 2,1 };auto res = Solution().Cal(a);AssertEx(0LL, res);}TEST_METHOD(TestMethod4){a = {4,1,1 };auto res = Solution().Cal(a);AssertEx(1LL, res);}TEST_METHOD(TestMethod5){const int E9 = 1'000'000'000;a = { E9,1,E9,1,E9,1,E9,1,E9,1,E9 };auto res = Solution().Cal(a);AssertEx(3LL*E9, res);}TEST_METHOD(TestMethod11){a = { 3,2,2,3,1 };auto res = Solution().Cal(a);AssertEx(3LL, res);}TEST_METHOD(TestMethod12){a = { 9,7,5,3,1 };auto res = Solution().Cal(a);AssertEx(0LL, res);}TEST_METHOD(TestMethod13){a = { 2021, 2021 };auto res = Solution().Cal(a);AssertEx(1LL, res);}TEST_METHOD(TestMethod14){a = { 12,2,34,85,4,91,29,85 };auto res = Solution().Cal(a);AssertEx(93LL, res);}TEST_METHOD(TestMethod15){a = { 2,1,4,1,1 };auto res = Solution().Cal(a);AssertEx(2LL, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

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

相关文章

力扣题解2332

大家好&#xff0c;欢迎来到无限大的频道。 今日继续给大家带来力扣题解。 题目描述&#xff08;中等&#xff09;​&#xff1a; 坐上公交的最晚时间 给你一个下标从 0 开始长度为 n 的整数数组 buses &#xff0c;其中 buses[i] 表示第 i 辆公交车的出发时间。同时给你一…

算法题——最小会议室数量

题目1: 1.假定会议时间从凌晨零点开始&#xff0c;即 0<si<ei<1440&#xff0c;si和ei代表当天某一时刻从零点开始计算的开始和结束分钟数&#xff0c;如[90,360]&#xff0c;表示会议时间从1:30到6:00。 2.不考虑房间的容量问题&#xff0c;并且公司为了提升大家的体…

计算机组成原理-存储系统(二)半导体存储器

2.1DAM芯片 分类&#xff1a; DRAM芯片&#xff1a;使用栅极电容存储信息SRAM芯片&#xff1a;使用双稳态触发器存储信息 核心区别&#xff1a;储存元不一样 2.2DRAM和SRAM的比较 对于DRAM中&#xff1a; 1&#xff1a;电容内存储了电荷0&#xff1a;电容内未存储电荷 DR…

HTML讲解(一)body部分

目录 1.什么是HTML 2.HTML基本框架 3.标题声明 4.修改标题位置 5.段落声明 6.修改段落位置 7.超链接访问 8.图像访问 9.改变网页背景及文本颜色 10.添加网页背景图 11.超链接改变颜色 12.设置网页边距 小心&#xff01;VS2022不可直接接触&#xff0c;否则&#xff…

Qt窗口——QMenuBar

文章目录 QMenuBar示例演示给菜单栏设置快捷键给菜单项设置快捷键添加子菜单添加分割线添加图标 QMenuBar Qt中采用QMenuBar来创建菜单栏&#xff0c;一个主窗口&#xff0c;只允许有一个菜单栏&#xff0c;位于主窗口的顶部、主窗口标题栏下面&#xff1b;一个菜单栏里面有多…

【技术解析】消息中间件MQ:从原理到RabbitMQ实战(深入浅出)

文章目录 【技术解析】消息中间件MQ&#xff1a;从原理到RabbitMQ实战(深入浅出)1.简介1.1 什么是消息中间件1.2 传统的http请求存在那些缺点1.3 Mq应用场景有那些1.4 为什么需要使用mq1.5 Mq与多线程之间区别1.6 Mq消息中间件名词1.7主流mq区别对比1.8 Mq设计基础知识 2.Rabbi…

python画图|3D bar进阶探索

前述学习过程只能怪&#xff0c;已经探究了3D直方图的基础教程&#xff0c;详见下述链接&#xff1a; python画图|3D直方图基础教程-CSDN博客 实际上&#xff0c;基础文章直接进入了堆叠教程&#xff0c;相对来说基础的程度不够&#xff0c;因此有必要再次探索。 【1】官网教…

通信工程学习:什么是POS无源光分配器

POS&#xff1a;无源光分配器 POS&#xff08;Passive Optical Splitter&#xff0c;无源光分配器&#xff09;是无源光网络&#xff08;Passive Optical Network, PON&#xff09;中的一个重要组成部分&#xff0c;它位于光线路终端&#xff08;OLT&#xff09;和光网络单元&a…

基于图卷积网络的轻量化推荐模型(论文复现)

基于图卷积网络的轻量化推荐模型&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 概述 图卷积网络&#xff08;Graph Convolution Network&#xff0c;GCN&#xff09;已经广泛的应用于推荐系统&#xff0c;基于GCN的协同过滤算法&#xff08;例如…

【路径规划】人工势场(APF)、涡旋APF、安全APF和动态窗口方法在航点跟踪问题的比较

摘要 本研究比较了几种路径规划算法在航路点跟踪中的性能&#xff0c;包括传统的人工势场算法&#xff08;APF&#xff09;、涡旋人工势场&#xff08;VAPF&#xff09;、安全人工势场&#xff08;SAPF&#xff09;和动态窗口方法&#xff08;DWA&#xff09;。实验结果表明&a…

PyCharm的使用

PyCharm的入门使用教程 下载和安装PyCharm&#xff1a; 首先&#xff0c;访问JetBrains官方网站&#xff08;https://www.jetbrains.com/pycharm/&#xff09;下载PyCharm的最新版本。根据您的操作系统选择合适的版本进行下载。 安装完成后&#xff0c;打开PyCharm。 创建新…

实战分享:我是如何挖到CSDN漏洞的?

文章目录 前言一、过程二、总结《Windows信息安全和网络攻防》——清华大学出版社 前言 CxxN是国内很出名的博客平台&#xff0c;用户量非常大&#xff0c;注册用户据说有1个亿&#xff1f;(官方写的)本次我发现的漏洞详情是可以通过用户的id直接获取用户完整的手机号&#xf…

如何创建和编辑抖音百科词条,不会的找我们代创建!

如何创建和编辑抖音百科词条&#xff0c;不会的找我们代创建&#xff01; 如何创建抖音百科个人词条&#xff0c;个人抖音百科的创建 #抖音百科 #百科 #推广 做过百度百科的老板们注意了&#xff0c;等一下别划走。 2024 年品宣新风口出现了&#xff0c;抖音百科正在替代百度…

金言问卷:国外问卷调查可以做吗?

国外问卷调查可不可以做&#xff1f; 金言问卷告诉你&#xff0c;答案是肯定可以的。接下来就给你讲讲为什么是肯定的答案。 首先&#xff0c;为什么是肯定可以做呢&#xff1f;因为国外问卷调查可以产生收益是真实的&#xff0c;像我们客户昨天193美元1350人民币&#xff0c…

Flutter Android Package调用python

操作步骤 一、创建一个Flutter Package 使用以下指令创建一个Flutter Package flutter create --templateplugin --platformsandroid,ios -a java flutter_package_python 二、修改android/build.gradle文件 在buildscript——>dependencies中添加以下内容 //导入Chaqu…

MySQL面试题--连续三天登录(困难)

一、准备工作 drop table if exists author_tb; CREATE TABLE author_tb (author_id int(10) NOT NULL,author_level int(10) NOT NULL,sex char(10) NOT NULL ); INSERT INTO author_tb VALUES(101, 6, m),(102, 1, f),(103, 1, m),(104, 3, m),(105, 4, f),(106…

Matlab 的.m 文件批量转成py文件

在工作中碰到了一个问题&#xff0c;需要将原来用matlab gui做出来的程序改为python程序&#xff0c;因为涉及到很多文件&#xff0c;所以在网上搜了搜有没有直接能转化的库。参考了【Matlab】一键Matlab代码转python代码详细教程_matlab2python-CSDN博客 这位博主提到的matla…

ReKep——李飞飞团队提出的新一代机器人操作方法:基于视觉语言模型和关键点约束

前言 由于工厂、车厂的任务需求场景非常明确&#xff0c;加之自今年年初以来&#xff0c;我司在机器人这个方向的持续大力度投入(包括南京、长沙两地机器人开发团队的先后组建)&#xff0c;使得近期我司七月接到了不少来自车厂/工厂的订单&#xff0c;比如柔性上料、物料分拣、…

自动泊车系统中的YOLOv8 pose关键点车位线检测

自动泊车系统中的YOLOv8关键点车位线检测技术解析 引言 随着智能驾驶技术的快速发展&#xff0c;自动泊车功能成为了现代汽车的重要组成部分。它不仅能够提高驾驶的安全性&#xff0c;还能在一定程度上解决城市停车难的问题。在自动泊车系统中&#xff0c;准确识别停车位的位置…

10年408考研真题-数据结构

23.[2010统考真题]若元素 a,b,c,d,e,f 依次进栈&#xff0c;允许进栈、退栈操作交替进行&#xff0c;但不允许连续3次进行退栈操作&#xff0c;不可能得到的出栈序列是(D)。 A.dcebfa B.cbdaef C.bcaefd D.afedcb 解析&#xff1a;直接看D选项&#xff0c…