贪心算法:拦截导弹问题

2023-12-17 07:32

本文主要是介绍贪心算法:拦截导弹问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

贪心算法:拦截导弹问题

Time Limit: 1 Sec
Memory Limit: 128 MB
64bit IO Format: %lld

Description

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

Input

包含多组测试数据。每组测试数据占一行。第一个正整数为导弹数量n,后面紧接n颗依次飞来的导弹的高度(1≤n≤1000)。

Output

输出要拦截所有导弹最小配备的系统数k。

Sample Input

8
389 207 155 300 299 170 158 65
(这里我改变了题目的数据样式,看的清楚一点)

Sample Output

2

傻瓜式总结,基本上是从新手踩雷的角度来做的。(我踩了大概一天的雷,春节围绕着一群可爱的小朋友写题)
在这里插入图片描述

首先题目分析

最贴合本身的思维就是按照那组数据的顺序,分出从大到小的几个数组,最后看有几组数组,就意味着我们要最少要有几套系统。
以题目数据为例

389 207 155 300 299 170 158 65

排序

1:389 300 299 170 158 65
2:207 155

所以最少需要两套系统

好的想到这里说明你已经有可能做出来了,
接下来就是一个急转弯。
在这里插入图片描述

相关知识

这里应用一个定理,这是一个dalao的博客
https://www.cnblogs.com/sj-gank/p/11417753.html

好的,我从里面总结出了一下几点

·······(这就是几点,理直气壮.jpg)

Dilworth定理的对偶定理:对于一个偏序集,其最少反链划分数等于其最长链的长度。
也就是说把一个数列划分成最少的最长不升子序列的数目就等于这个数列的最长上升子序列的长度。

好的,就是这个加粗。
是不是觉得自己会了?(之后wa了很多遍的我反正当时是这样想的)

然后我们再引进一个STL的函数lower_boundupper_bound库文件#include algorithm

这两个函数的作用概括一下
就是在指定的数组里寻找****第一个比一个常数值(比如说x
大于等于(lower_bound)
大于(upper_bound)

lower_bound(a + 1, a + 1 + n, x);
upper_bound(a + 1, a + 1 + n, x);

(这道题的特殊性是用了a+1,后面讲,其实这只是传地址而已,写成单独的a也行)

顺便说一下STL里的所有涉及到数组的起始的比较都是要求升序的。
在这里插入图片描述

目的变成了利用上面的函数找到最长的一组递增数

注意:这组数是可以不连续的。(不信自己试,但是dilworth定理里链的定义我没有细看,也不知道,可能有关系。至于我怎么在没看懂的情况下发现的,归功于wa。)

下面就是逐项比较,用一个数组记录,最后输出最长的递增数的个数。

上代码

#include<iostream>
using namespace std;
#include<string>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<map>const int N = 1e5+10;
int a[N], d[N], n;int main()
{ios_base::sync_with_stdio(0);while(cin >> n){for(int i=1;i<=n;i++)cin >> a[i];int len = 1;d[1] = a[1];for (int i=2; i<=n; i++){if(d[len] < a[i])d[++len] = a[i];else{int p = lower_bound(d + 1, d + 1 + len, a[i]) - d;d[p] = a[i];}}cout << len << endl;}return 0;
}

这篇关于贪心算法:拦截导弹问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/503593

相关文章

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

SpringBoot首笔交易慢问题排查与优化方案

《SpringBoot首笔交易慢问题排查与优化方案》在我们的微服务项目中,遇到这样的问题:应用启动后,第一笔交易响应耗时高达4、5秒,而后续请求均能在毫秒级完成,这不仅触发监控告警,也极大影响了用户体... 目录问题背景排查步骤1. 日志分析2. 性能工具定位优化方案:提前预热各种资源1. Flowable

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

如何解决mysql出现Incorrect string value for column ‘表项‘ at row 1错误问题

《如何解决mysql出现Incorrectstringvalueforcolumn‘表项‘atrow1错误问题》:本文主要介绍如何解决mysql出现Incorrectstringv... 目录mysql出现Incorrect string value for column ‘表项‘ at row 1错误报错

如何解决Spring MVC中响应乱码问题

《如何解决SpringMVC中响应乱码问题》:本文主要介绍如何解决SpringMVC中响应乱码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Spring MVC最新响应中乱码解决方式以前的解决办法这是比较通用的一种方法总结Spring MVC最新响应中乱码解

pip无法安装osgeo失败的问题解决

《pip无法安装osgeo失败的问题解决》本文主要介绍了pip无法安装osgeo失败的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 进入官方提供的扩展包下载网站寻找版本适配的whl文件注意:要选择cp(python版本)和你py