洛谷 P1020 [NOIP1999 提高组] 导弹拦截

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式

一行,若干个整数,中间由空格隔开。

输出格式

两行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

思路:

首先呢分析一下题目,需要我们求出系统一次最多拦多少枚,其次还需要得出一个把这些导弹全拦下的系统数量的最小值。

第一问

求一次最多拦多少枚,其实就是一个子序列问题,题目说:以后每一发炮弹都不能高于前一发的高度。那就是求最大下降子序列长度呗,这个问题如果学过"LIS"(Longest Increasing Subsequence)那基本第一问在2两分钟之内是能出代码的,没学过的话可以去了解了解,这个是在计算机科学当中是一个非常常见的概念。

第二问

求系统数量的最小值,这个确实要不好想一些。一般呢遇到这种问题尤其是这个最值他不是很直观的时候就要想:能不能贪心呢?很明显是可以的,从头遍历数组,维护的一个单调栈,如果指针指向的值小于栈顶直接加入这个栈,如果大于那就去遍历下一个栈顶,如果全部都加入不了,哎这时候就要再开一个新栈了,最后返回栈的数量就是答案啦

这里我提供两种方法:

解决

(1)动态规划

时间复杂度:O(n^2)

代码

#include <bits/stdc++.h>
using namespace std;const int N = 1e3 + 5;
int a[N],f[N],g[N];int n = 0,ans = 1,res = 1;int main()
{while(cin >> a[n]){f[n] = 1;n ++;}for(int i=n-2;i>=0;i--){for(int j=n-1;j>i;j--){if(a[i] >= a[j]) f[i] = max(f[i],f[j] + 1);}ans = max(ans,f[i]);}cout << ans << endl;g[0] = a[0];for(int i=1;i<n;i++){int k = 0;while(k < res && g[k] < a[i]) k ++;g[k] = a[i];if(k >= res) res ++;}cout << res << endl;return 0;
}

   (2)二分

时间复杂度:O(nlogn)

代码
 

#include <bits/stdc++.h>
using namespace std;const int N = 1e5 + 5;
int a[N], dp[N],f[N];int main() {string input;getline(cin, input);stringstream ss(input);int n = 0;while (ss >> a[n]) {n++;}dp[0] = a[0];int cnt = 0,res = 0;for (int i = 1; i < n; i++) {if (a[i] <= dp[cnt]) {dp[++cnt] = a[i];} else {int l = 0, r = cnt;while (l < r) {int mid = (l + r) / 2;if (a[i] > dp[mid]) {r = mid;} else {l = mid + 1;}}dp[l] = a[i];}}cout << cnt + 1 << endl;f[0] = a[0];for(int i=1;i<n;i++){int k = 0;while(k < res && f[k] < a[i]) k ++;f[k] = a[i];if(k >= res) res ++;}cout << res << endl;return 0;
}

我推荐二分,二分比动态规划好,时间上面是完胜的

加油呗

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

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

相关文章

下拉菜单显示年份选项(月份也适用)

项目场景&#xff1a; 下拉菜单显示年份选项&#xff08;月份也适用&#xff09; 前段语言Vue 问题描述 在列表的搜索栏常常需要提供年份、月份选择&#xff0c;此文记录一种简单的年份下拉菜单的展示方式&#xff1a; <el-form-item label"年份" prop"yea…

战略资讯 | TapData 牵手思想科技,开启数据管理新篇章!

在这个数字化飞速发展的时代&#xff0c;数据已成为企业最宝贵的资产之一。为了更好地迎接新时代的诉求与挑战&#xff0c;TapData 现已与思想科技达成了一项具有里程碑意义的战略合作协议。这不仅是两个企业之间的合作&#xff0c;更是对整个数据管理行业的一次重大推动。 思…

兴业严选|北京市户籍 多子女家庭买二套房个贷算首套

6月26日&#xff0c;北京市住房和城乡建设委员会、中国人民银行北京市分行、国家金融监督管理总局北京监管局、北京住房公积金管理中心联合印发《关于优化本市房地产市场平稳健康发展政策措施的通知》。 明确支持多子女家庭改善性住房需求&#xff0c;对北京市户籍二孩及以上的…

ode45的例程|MATLAB例程|四阶龙格库塔定步长节微分方程

ode45自己编的程序和测试代码 模型 模拟一个卫星绕大行星飞行的轨迹计算。 结果 轨迹图如下: 源代码 以下代码复制到MATLAB上即可运行,并得到上面的图像: % ode45自己编的程序和测试代码 % Evand©2024 % 2024-7-2/Ver1 clear;clc;close all; rng(0); % 参数设定…

C++Primer Plus 第十四章代码重用:编程练习,第5题

CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第5题 CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第5题 文章目录 CPrimer Plus 第十四章代码重用&#xff1a;编程练习,第5题前言5. 一、方法二、解答 前言 5. 下面是一些类声明: //emp.h--header file for ab…

OpenSSL EVP详解

OpenSSL EVP详解 Chapter1 OpenSSL EVP详解一、EVP基本介绍1. EVP 加密和解密2. EVP 签名和验证3. EVP 加解密文件 二、源码结构2.1 全局函数2.2 BIO扩充2.3 摘要算法EVP封装2.4 对称算法EVP封装2.5 非对称算法EVP封装2.6 基于口令的加密 三、开发实例3.1 示例13.2 示例23.3 示…

【MySQL】数据库——备份与恢复,日志管理

一、数据备份的重要性 1.备份的主要目的是灾难恢复 在生产环境中&#xff0c;数据的安全性至关重要 任何数据的丢失都可能产生严重的后果造成数据丢失的原因&#xff1a; 程序错误人为,操作错误运算错误磁盘故障灾难&#xff08;如火灾、地震&#xff09;和盗窃 2.数据库备份…

【5G射频基本架构】

平台框架 平台演进及搭配 5G NR频谱 NSA/SA/ENDC 在双连接中&#xff0c;UE在连接状态下可同时使用至少两个不同基站的无线资源。对于Sprint&#xff0c;ENDC将允许设备在相同的频段&#xff08;41 / 2.5 GHz频段&#xff09;上同时访问LTE和5G。 手机硬件实现ENDC方式—类似LT…

动态住宅代理IP的优势是什么?什么地方用到?

在大数据时代的背景下&#xff0c;代理IP成为了很多企业顺利开展的重要工具。代理IP地址可以分为住宅代理IP地址和数据中心代理IP地址。选择住宅代理IP的好处是可以实现真正的高匿名性&#xff0c;而使用数据中心代理IP可能会暴露自己使用代理的情况。 住宅代理IP是指互联网服务…

数据库系统概论 | 触发器代码 | 行级触发器 | 语句级触发器

触发器 这篇博客拿两个例子来解释一下什么是行级触发器和语句级触发器。 **例子1&#xff1a;**当对表SC的Grade属性进行修改时&#xff0c;若分数增加了10%&#xff0c;则将此次操作记录到另一个表SC_U&#xff08;Sno CHAR(8)、Cno CHAR(5)、Oldgrade SMALLINT、Newgrade S…

Flink 窗口触发器(Trigger)(一)

Flink 窗口触发器(Trigger)(一) Flink 窗口触发器(Trigger)(二) Flink的窗口触发器&#xff08;Trigger&#xff09;是流处理中一个非常关键的概念&#xff0c;它定义了窗口何时被触发并决定触发后的行为&#xff08;如进行窗口数据的计算或清理&#xff09;。 一、基本概念 …

[数据集][目标检测]人员状态跑睡抽烟打电话跌倒检测数据集4943张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4943 标注数量(xml文件个数)&#xff1a;4943 标注数量(txt文件个数)&#xff1a;4943 标注…

[Leetcode 136][Easy]-只出现一次的数字

目录 题目描述 具体思路 题目描述 原题链接 具体思路 ①首先看到数组中重复的数字&#xff0c;想到快慢指针&#xff0c;但是数组的元素是乱序的不好求。因此先对数组排序。使用了STL库的sort函数&#xff0c;时间复杂度O(nlogn)不符合题目要求&#xff0c;空间复杂度O(1)。…

Pytorch学习之torch.split函数

Pytorch学习之torch.split函数 一、简介 torch.split用于将一个张量&#xff08;tensor&#xff09;沿指定维度&#xff08;dim&#xff09;拆分为多个子张量。这个函数对于处理需要按块拆分数据的任务非常有用&#xff0c;例如在自然语言处理和图像处理中的数据预处理。 二…

RXMH2 RK223 069 AS大容量中间继电器 板前接线 约瑟JOSEF

RXMH2大容量中间继电器型号&#xff1a; RXMH2 RK 223 067大容量中间继电器&#xff1b; RXMH2 RK 223 068大容量中间继电器&#xff1b; RXMH2 RK 223 069大容量中间继电器&#xff1b; RXMH2 RK 223 070大容量中间继电器&#xff1b; 用途 用于电力系统二次回路及工业自…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建Kafka大数据运算环境---任务11:基础环境准备

任务描述 任务主要是安装配置基础环境&#xff0c;主要内容包括&#xff1a; 1、安装java Kafka和ZooKeeper都需要安装Java环境&#xff0c;推荐至少Java8及以上版本 2、安装ZooKeeper ZooKeeper是Kafka集群的必要组件 3、安装kafka Kafka版本包括使用的scala语言版本和kafka版…

Ubuntu22.04上Docker的安装

1. 使用APT安装 首先安装HTTPS传输的软件包和CA证书&#xff0c;确保软件下载过程中不被篡改。 sudo apt-get updatesudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y然后&#xff0c;使用国内源&#xff0c;并添加软件源的 GPG 密钥以防…

Java面试题:讨论持续集成/持续部署的重要性,并描述如何在项目中实施CI/CD流程

持续集成/持续部署&#xff08;CI/CD&#xff09;的重要性 持续集成&#xff08;Continuous Integration, CI&#xff09; 和 持续部署&#xff08;Continuous Deployment, CD&#xff09; 是现代软件开发的重要实践。这些方法通过自动化构建、测试和部署过程&#xff0c;显著…

Ubuntu 用户配置

环境信息 系统版本Ubuntu16.04.1-Ubuntu x86_64 创建用户组 新建一个用户组&#xff0c;GID为888。 sudo addgroup –g 888 组名删除用户组 sudo delgroup 组名创建用户 username 为用户名&#xff0c;执行后系统会提示输入新用户的密码&#xff0c;后续输入其他信息&#xff0…

代码随想录day34 贪心(5)

56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 写法一&#xff1a;维护right和left两个数作为当前区间的左右边界 class Solution:def merge(self, intervals: List[List[int]]) -> List[List[int]]:intervals.sort(key lambda x: x[0])left intervals[0][0]ri…