Acwing 1010. 拦截导弹

news2024/11/15 19:48:40

Acwing 1010. 拦截导弹

  • 一、问题描述
  • 二、算法分析
  • 三、代码实现

一、问题描述

在这里插入图片描述

二、算法分析

这道题共分为两问,我们先看第一问。
该问的背后是一个很经典的最长单调子序列模型
在这个模型中,我们的状态 f [ i ] f[i] f[i]的定义是,以第 i i i个元素为结尾的下降(上升)子序列中最长的一个子序列的长度。
状态转移方程也很简单,就是看一看以前面i个元素为结尾的最长子序列中,哪一个能够在后面接上第i个元素,然后在这些可能中取一个最大值。

f [ i ] = m a x ( f [ i ] , f [ j ] + 1 , f [ k ] + 1 , . . . )     a [ j ] > a [ i ] , a [ k ] > a [ i ] , k < i , j < i f[i]=max(f[i],f[j]+1,f[k]+1,...)\ \ \ a[j]>a[i],a[k]>a[i],k<i,j<i f[i]=max(f[i],f[j]+1,f[k]+1,...)   a[j]>a[i],a[k]>a[i],k<i,j<i

由于第一问的模型在之前的文章中有过详细地讲解,所以本篇文章重点在于讲解第二问。因此,如果大家对第一问还存在疑惑的话,建议大家去看一看作者之前写的文章:最长上升子序列优化(贪心+二分)(超级详细的讲解)

比较麻烦的是第二问,第二问的意思是,至少需要几个这样的子序列能够覆盖掉所有的元素。
在第二问中,我们使用的算法是贪心。

对于每个导弹而言,有两种选择,第一种选择就是接在当前以后的子序列的后面(如果单调性符合题意的话),第二种选择就是再创建一个新的序列。而再第一种情况当中,我们又可以做出很多种选择,因为符合单调性条件的序列可能有很多,但是具体选择哪一个是最优的选择,我们目前并不知道。

而对于贪心的题目而言,一般情况下,我们都需要先猜测出一个策略,然后对这个策略进行证明,从而体现出我们策略的正确性。在这道题中,我们想要子序列的数目最少,我们大概率是想把一个新的导弹高度接在一个现有的序列的后面。

对于这个猜测,我们可以做一个简单的证明:
假设我们的蓝色情况是在能够接在某个子序列的后面的情况下,依旧选择了自己创建一个新的子序列。我们接下的目的就是证明这种选择不是最优解。
在这里插入图片描述
我们假设这个蓝色情况能够接在第一个子序列的红黑交界处,此时就会有两种可能,第一种就是红色无法接在蓝色的后面,第二种就是红色能够链接在二者之间。如下图所示:
在这里插入图片描述
很明显,无论上述哪种可能,最后的结果都是小于等于我们假设的那种情况。也就是说存在一些情况,导致假设的最优选择不是最优的,反而我们的猜测是最优的。因此,我们的猜测是成立的。

根据上面的推到,我们已经知道,对于一个导弹而言,在满足单调性的条件下,接在已经存在的子序列的后面是最优的选择。但是我们还需要考虑一个问题,当有多个子序列符合条件时,我们接在哪一个的后面呢?

根据我们之前的经验,我们的子序列都是单调递减的,因此,将当前的导弹接在符合条件的子序列中,末尾元素最小的那一个的子序列的后面。

接着,我们尝试证明这个观点:
在这里插入图片描述
如果此时我们存在一个:y,满足y大于b,但是y小于a。此时我们就会发现,在左侧的方案中,我们可以将y接在A的子序列中,但是在假设的情况里,我们只能重新创建一个新的序列。此时我们贪心算法得到的解就小于了我们假设的情况下所得到的解,而我们想要求的是最小数量,因此,假设的情况不是最优解。

那么假设的情况里,还可以接在b的后面,这种情况下,我们再来比较一下两种选择。如果接在b的后面的话,我们的y在假设的情况中也可以接在A序列的后面,此时两种方案的结果是一样的。也就是说,我们的最优解的答案小于等于假设情况下的答案。

因此,我们的贪心策略是最优解。

那么经过一系列的分析,得出最终的做法:对于任一导弹高度,如果能够接在当前存在的子序列的后面,则接在符合条件的子序列中,末尾元素最小的那个子序列的后面。如果不能接在当前存在的序列的后面,即当前高度高于所有子序列的末尾元素,那么此时我们就再创建一个新的序列。

而这个做法恰好是最长上升子序列的贪心做法。也就是说,当我们想用尽可能少的下降子序列去覆盖整个序列的时候,这个最小值恰好等于最长上升子序列的长度。

三、代码实现

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int a[N],f[N],g[N];
int n;
int main()
{
    while(cin>>a[n])n++;
    int len1=0;
    for(int i=0;i<n;i++)
    {
        int l=0,r=len1;
        while(l<r)
        {
            int mid=l+r+1>>1;
            if(f[mid]>=a[i])l=mid;
            else r=mid-1;
        }
        len1=max(len1,r+1);
        f[r+1]=a[i];
    }
    cout<<len1<<endl;
    int len2=0;
    for(int i=0;i<n;i++)
    {
        int l=0,r=len2;
        while(l<r)
        {
            int mid=l+r+1>>1;
            if(g[mid]<a[i])l=mid;
            else r=mid-1;
        }
        len2=max(len2,r+1);
        g[r+1]=a[i];
    }
    cout<<len2<<endl;
    return 0;
}

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

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

相关文章

Cert Manager 申请SSL证书流程及相关概念-三

中英文对照表 英文英文 - K8S CRD中文备注certificatesCertificate证书certificates.cert-manager.io/v1certificate issuersIssuer证书颁发者issuers.cert-manager.ioClusterIssuer集群证书颁发者clusterissuers.cert-manager.iocertificate requestCertificateRequest证书申…

50个你离不开的 CLI 工具

作为开发人员&#xff0c;我们在终端上花费了大量时间。有很多有用的 CLI 工具&#xff0c;它们可以让您在命令行中的生活更轻松、更快速&#xff0c;而且通常更有趣。这篇文章概述了我最依赖的 50 个必备 CLI 工具。如果我遗漏了什么 - 请在评论中告诉我 :)在本文的结尾&#…

二叉树专题汇总

二叉树的前中后序遍历day11|144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历_奈川直子的博客-CSDN博客二叉树的层序遍历、翻转二叉树、对称二叉树day12|层序遍历合集、226.翻转二叉树、101.对称二叉树_奈川直子的博客-CSDN博客N叉树最大深度、完全二叉树节点…

LCHub:2023年无代码、低代码8大技术趋势

在数字化转型、新冠疫情、全球经济环境动荡等多因素驱动下,使得组织改变了对低代码、无代码的看法,市场规模和场景化落地实现快速增长。根据Gartner预测,到2025年,70%的应用程序将由低代码和无代码开发平台构建,其中 80%的应用程序由非IT工作者开发而成。 没有编程背景的…

青山不语,碧海无痕,数字山河间的中国脊梁

刚刚过去的2022&#xff0c;对于新农人来说&#xff0c;是不寻常的一年。福建宁德的渔民祖祖辈辈都以外出打鱼为生&#xff0c;渔排生活条件艰苦&#xff0c;娱乐匮乏&#xff0c;销路也不稳定&#xff0c;这种苦闷正随着AI、直播等数字新技术的到来而被消解。青海列卜加村的孙…

Arduino的nodemcu 8266开发板使用MicroPython开发的整体流程

程序安装准备 安装开发板驱动&#xff0c;官网&#xff1a;&#xff08;https://cn.silabs.com/developers/usb-to-uart-bridge-vcp-drivers?tabdownloads&#xff09;这里不是CH340驱动&#xff0c;而是CP210x USB to USART 驱动&#xff0c;最终也是在“设备管理器查看COM口…

【LeetCode:33. 搜索旋转排序数组~~~二分】

题目描述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…

操作系统真相还原_第5章第1节:利用BIOS中断0x15 获取内存信息

文章目录功能号返回信息功能号详解子功能号&#xff1a;0xE820子功能号&#xff1a;0xE801子功能号&#xff1a;0x88内存检测示例当前内存分布说明程序boot.incmbr.sloader.s编译并写入硬盘启动bochs运行功能号 EAX0xE820&#xff1a;遍历主机上全部内存 AX0xE801&#xff1a;…

分享121个ASP源码,总有一款适合您

ASP源码 分享121个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 121个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1wwsIoZidHihm5WHPKjlvMg?pwdew3b 提取码&#x…

如何在linux服务器部署sonar服务?

文章目录前言一、上传sonar插件二、设置sonar插件的权限三、启动插件四、配置环境变量前言 sonar服务是代码质量扫描的工具,我们如何利用sonar进行代码质量扫描还有在linux服务器上部署呢?下面这篇文章详细的记录了我在sonar的使用过程中所遇到的各种坑。 一、上传sonar插件…

十大经典排序算法【算法思想+图解+代码】【数据结构与算法笔记】

前言&#xff1a;文中大部分为本人收集整理&#xff0c;综合学习资料&#xff0c;个人理解……。希望能帮助你少掉写头发&#xff0c;早日走出理解的深渊。因为写作较为仓促文中内容难免会有纰漏&#xff0c;发现可评论区回复&#xff08;无奖&#xff09;。排序(Sort)分析排序…

StudioOne6旗舰版DAW2023跨版本升级新功能介绍

PreSonus2023发布了Studio One 6旗舰级DAW的跨版本升级。他们获奖的DAW软件的这一最新版本引入了大量的新功能和增强功能&#xff0c;包括用户界面的定制选项&#xff0c;PreSonus说这使第6版成为他们迄今为止最个性化的升级。PreSonus发布了旗舰级DAW的跨版本升级&#xff0c;…

Leetcode:131. 分割回文串(C++)

目录 问题描述&#xff1a; 实现代码与解析&#xff1a; 回溯&#xff1a; 原理思路&#xff1a; 问题描述&#xff1a; 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都…

客快物流大数据项目(一百零六):实时ETL处理

文章目录 实时ETL处理 一、业务流程 二、​​

Kettle简介

一、Kettle基本介绍 Kettle(现更名为Pentaho Data Integration-Pentaho)是一款国外开源的ETL工具&#xff0c;纯java编写&#xff0c;可以在Window、Linux、Unix上运行&#xff0c;绿色无需安装。它允许你管理来自不同数据库的数据&#xff0c;通过提供一个图形化的用户环境来…

盒模型应用 改变宽高范围 改变背景覆盖范围 溢出处理 断词规则 空白处理

目录盒模型应用改变宽高范围改变背景覆盖范围溢出处理断词规则 word-break空白处理 溢出的空白处理盒模型应用 改变宽高范围 默认情况下&#xff0c;width 和 height 设置的是内容盒宽高。 页面重构师&#xff1a;将psd文件&#xff08;设计稿&#xff09;制作为静态页面 衡量…

【竞赛题】6297. 根据第 K 场考试的分数排序

题目 班里有 m 位学生&#xff0c;共计划组织 n 场考试。给你一个下标从 0 开始、大小为 m x n 的整数矩阵 score &#xff0c;其中每一行对应一位学生&#xff0c;而 score[i][j] 表示第 i 位学生在第 j 场考试取得的分数。矩阵 score 包含的整数 互不相同 。 另给你一个整数…

【机器学习】多标签分类

目录&#xff1a;多标签分类一、算法1.1 One-vs-Rest1.2 AdaBoost-MH1.3 ML-KNN一、算法 多标签分类的适用场景较为常见&#xff0c;比如&#xff0c;一份歌单可能既属于标签旅行也属于标签驾车。有别于多分类分类&#xff0c;多标签分类中每个标签不是互斥的。多标签分类算法…

Python使用K-means聚类分析

Python使用K-means聚类分析 文章目录Python使用K-means聚类分析介绍1.集群标签作为特征一、k-均值聚类二、示例 - 加州住房2.KMeans总结介绍 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 本文将使用所谓的无监督学习算法。 无监督算法不使用目标&#xff…

软件测试复习11:自动化测试

专栏&#xff1a;《软件测试》 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录自动化测试的前提自动化测试的过程自动化测试的5个级别自动化测试的局限自动化测试的前提 自动化测试可以很好地代替人&#xf…