【StarryCoding P101】排水管道 题解(单调栈+贪心算法)

[P101] 排水管道

问题描述

给定一个长度为 n n n 的数组 a a a ,请问至少修改多少个元素,可以使得数组成为一个严格上升的序列。

数组中需要时刻保持 a i > 0 a_i > 0 ai>0

输入描述

第一行一个整数 T T T 表示测试用例个数。 ( 1 ≤ T ≤ 1000 ) (1 \leq T \leq 1000) (1T1000)

对于每组测试用例,第一行一个整数 n n n 表示数组中元素个数。 ( 1 ≤ n ≤ 1 0 5 ) (1 \leq n \leq 10^5) (1n105)

第二行 n n n 个整数表示表示数组 a a a ( 1 ≤ a i ≤ 1 0 9 ) (1 \leq a_i \leq 10^9) (1ai109)

数据保证 ∑ n ≤ 1 0 6 \sum n \leq 10^6 n106

输出描述

对于每组测试用例,一个整数表示答案。

输入样例

3
5
1 2 1 3 9
2
2 1
1
1

输出样例

2
1
0

思路

首先,定义一个大小为 N N N的数组 a a a和单调栈 s t k stk stk,以及栈顶指针 t o p top top N N N是预定义的数组和栈的最大容量, s t k stk stk的作用是存储单调序列, t o p top top用于指示栈顶的位置。

在主函数中,首先读取测试用例的数量 t t t,然后对每个测试用例执行以下操作:

读取数组长度 n n n,然后读取 n n n个数组元素。对于每个元素 a [ i ] a[i] a[i],将元素 a [ i ] a[i] a[i]减去其索引 i i i,如果结果小于 0 0 0,则跳过此元素。减去索引后的结果如果小于 0 0 0,那么这个元素就不可能属于最终的上升序列。

接下来,如果栈为空,或者栈顶元素小于等于 a [ i ] a[i] a[i],则将 a [ i ] a[i] a[i]压入栈中。这是因为我们要构造的是一个严格上升的序列,所以新的元素必须大于前一个元素。

如果栈不为空且栈顶元素大于 a [ i ] a[i] a[i],则在栈中找到第一个大于 a [ i ] a[i] a[i]的元素,并将其替换为 a [ i ] a[i] a[i]。利用贪心算法的思想,将大的元素替换为小的元素,可以增加后续元素被压入栈的可能性,从而尽可能地减少需要修改的元素数量。

最后,输出 n − t o p n - top ntop,这是因为 t o p top top表示的是最长上升子序列的长度,而 n − t o p n - top ntop就是需要修改的元素数量。


AC代码

#include <algorithm>
#include <iostream>
#define mp make_pair
#define AUTHOR "HEX9CF"
using namespace std;
using ll = long long;const int N = 1e6 + 7;
const int INF = 0x3f3f3f3f;
const ll MOD = 1e9 + 7;int t, n;
int a[N];int top = 0;
int stk[N];int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin >> t;while (t--) {top = 0;cin >> n;for (int i = 1; i <= n; i++) {cin >> a[i];a[i] -= i;if (a[i] < 0) {// a[i]必须大于等于i才能严格上升continue;}if (!top || stk[top] <= a[i]) {// pushstk[++top] = a[i];} else {// 替换栈中第一个比a[i]大的元素int pos = upper_bound(stk + 1, stk + 1 + top, a[i]) - stk;stk[pos] = a[i];}}cout << (n - top) << endl;}return 0;
}

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

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

相关文章

C++练手题系列一

第 1 题 【 问答题 】 • 有多少种二叉树 输入n(1<n<13)&#xff0c;求n个结点的二叉树有多少种形态 时间限制&#xff1a;1000 内存限制&#xff1a;65536 输入 整数n 输出答案 样例输入 3 样例输出 5 第 2 题 【 问答题 】 • 城堡问题 1 2 3 4 5 6 7 ################…

【Golang星辰图】探索网络和HTTP的奇妙世界:使用Go语言打造高性能应用

提升Web开发效率&#xff1a;学会使用Go语言的网络和HTTP库 前言 随着互联网的快速发展&#xff0c;网络和HTTP成为了现代应用开发中必不可少的部分。Go语言作为一门快速、可靠和高效的编程语言&#xff0c;提供了丰富的网络编程和HTTP处理库&#xff0c;使得构建高性能的网络…

凌特杯,第二届,数字音频传输。simulink matlab

终于比赛进入了尾声&#xff0c;最为指导老师也是非常的激动。接下来进入了论文写作阶段和视频拍摄阶段。 第二届凌特杯规定的硬件是ADI的Pluto&#xff0c;成本在2k以内&#xff0c;能支持MATLAB&#xff0c;它能够流畅的实时播放接收到的音乐数据&#xff0c;并把数据保存成…

家居EDI:La-Z-Boy EDI 项目案例

家居行业市场规模庞大&#xff0c;总规模稳定增长。随着信息技术的发展以及全球化进程的加快&#xff0c;许多家居行业的老牌企业在全球范围内广泛扩展其供应链体系&#xff0c;产业链较长&#xff0c;从原材料生产供应、生产制造到销售运输&#xff0c;如何高效、准确地处理这…

CI/CD 工具比较:Jenkins、GitLab CI、Buildbot、Drone 和 Concourse

介绍 持续集成、交付和部署是旨在帮助增加开发速度并发布经过充分测试的可用产品的策略。持续集成鼓励开发团队尽早测试和集成其对共享代码库的更改&#xff0c;以最小化集成冲突。持续交付建立在此基础上&#xff0c;通过消除部署或发布过程中的障碍。持续部署则进一步通过自…

CH582F核心板入门:RGB灯点亮与蓝牙上报功能实战

文章目录 一、前言二、硬件1.原理图2.实物图3.实物连接图 三、软件1.初始化2.显示部分3.输出部分&#xff08;打印和蓝牙上报&#xff09;4.结果4.1 打印结果4.2 蓝牙上报4.2.1 打开手机蓝牙调试助手&#xff0c;找到ble_test_XXXX4.2.2 点击CONNECT4.2.3 找到Unknown Service服…

STM32(15)USART编程

使用USART实现STM32与电脑之间的通信 中介&#xff1a;USB转TTL模块 闭合总开关&#xff0c;外部时钟才会传输到分频器 c8t6手册里面写了&#xff0c;usart最大支持4.5MHz&#xff0c;所以选10 重映射时记得开启AFIO的时钟

python网络爬虫教程笔记(1)

系列文章目录 文章目录 系列文章目录前言一、爬虫入门1.爬虫是什么&#xff1f;2.爬虫工作原理3.爬虫基本原理4.工作流程5.HTTP请求6.HTTP响应7.HTTP原理&#xff1a;证书传递、验证和数据加密、解密过程解析8.Urllib.request库的使用9.TCP3次握手&#xff0c;4次挥手过程 总结…

PCB电路中每个层是什么?有什么作用

在电子工程领域中&#xff0c;印刷电路板&#xff08;PCB&#xff09;是不可或缺的组件&#xff0c;它承载着电子元件之间的连接与通信&#xff0c;而PCB并非单层结构&#xff0c;是由多个层次构成&#xff0c;每层都有其特定的功能和作用&#xff0c;下面我们一起来聊聊。 1、…

计算机网络实验一 网线制作

实验目的与要求&#xff1a; 实验目的 了解以太网网线&#xff08;双绞线&#xff09;和制作方法 实验内容 了解网线和水晶头 学习网线制作方法 实验环境和要求 网线 水晶头 压线钳 剥线钳 网线测试器 方法、步骤&#xff1a; 步骤一 准备工具和材料 步骤二 剥掉双绞线的外…

基于 Vue3打造前台+中台通用提效解决方案(下)

47、通用组件 - 倒计时组件 特惠部分存在一个倒计时的功能,所以我们需要先处理对应的倒计时模块,并把它处理成一个通用组件。 那么对于倒计时模块我们又应该如何进行处理呢? 所谓倒计时,其实更多的是一个时间的处理,那么对于时间的处理,此时我们就需要使用到一个第三方…

libigl 网格平均曲率计算

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 根据 Laplace-Beltrami 算子与平均曲率法向的关系: 又根据余切 Laplace-Beltrami 算子的定义: 其中 Ai 为该点邻域面积,取 Voronoi cell 面积如下: 得到

蓝桥杯第2章_基础算法4

2.小浩的ABC - 蓝桥云课 (lanqiao.cn) #include<bits/stdc.h> using namespace std; const int N1e6; int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);int n;cin>>n;while(n--){long long x;cin>>x;if(x1)cout<<-1<<\n;else if(x-…

spark 报错总结

&#xff08;一&#xff09; spark 报错&#xff1a;spark SparkSession.builder() TypeError: Builder object is not callable 解决办法&#xff1a;.builder() 改为 .builder spark SparkSession.builder() 改为 spark SparkSession.builder

uniapp制作--简单的tab切换

一、实现思路 在UniApp中&#xff0c;可以使用v-if来控制Tab栏并进行切换。 创建一个方法来控制点击时的效果。 二、实现步骤 ①view部分展示 <!-- tab选项 --><view class"select-area"><view class"select-top"><view clas…

Learning and Leveraging World Models in Visual Representation Learning

Learning and Leveraging World Models in Visual Representation Learning 相关链接&#xff1a;arxiv 关键字&#xff1a;学习世界模型、视觉表示学习、自监督学习、JEPA、Image World Models 摘要 本文探索了在自监督视觉表示学习中学习和利用世界模型的方法。作者引入了图…

基于Python+Flask实现一个TODO任务管理系统网站

随着科技的进步&#xff0c;数字化的任务清单逐渐成为生活中不可或缺的一部分。它们不仅可以帮助我们跟踪日常任务&#xff0c;还可以提高效率。但是&#xff0c;你是否考虑过自己制作一个任务管理系统呢&#xff1f; 好消息是&#xff0c;使用Python和Flask&#xff0c;我们可…

Redis 之六:Redis 的哨兵模式(Sentinel)

Redis 哨兵&#xff08;Sentinel&#xff09;模式是一种高可用性解决方案&#xff0c;用于监控和自动故障转移的集群系统。 在 Redis Sentinel 架构中&#xff0c;哨兵是一组运行在特殊模式下的 Redis 进程&#xff0c;它们可以监控一个或多个主从复制结构中的 Redis 主服务器以…

小脑萎缩患者必备营养指南

亲爱的读者朋友们&#xff0c;您是否了解小脑萎缩这一疾病&#xff1f;这是一种逐渐发展的神经退行性疾病&#xff0c;对患者的生活质量影响重大。面对这样的挑战&#xff0c;除了必要的医疗干预外&#xff0c;日常饮食和营养管理也扮演着至关重要的角色。今天&#xff0c;让我…