Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)

Description

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

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

Input

一行,若干个正整数最多100个。

Output

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

Sample Input

389 207 155 300 299 170 158 65

Sample Output

6

2

Http

Luogu:https://www.luogu.org/problem/show?pid=1020

Source

二分,贪心,最长不下降子序列,单调队列

解决思路

第一问比较容易理解,就是求最长不上升子序列。动态规划的方法可以过,但复杂度是n^2的,这里介绍另外一种方法。

首先想清楚一点,求最长不上升子序列就是求倒序的最长不下降子序列。

首先来讲一下操作吧:我们用一个vector(下面命名为Arr)来进行操作,具体如下:

从后往前扫描导弹的高度,设当前高度为x,那么若Arr为空或Arr的最后一个数比x小,则直接把x放到Arr尾部。

否则,找到第一个大于x的数,将其用x替换。

这个方法为什么是对的呢?它是基于贪心的思想,就是要使得Arr中的数尽量小(因为要求最长嘛),如果实在不行,就把Arr的长度+1,把这个数直接放到尾部。

那么关于查找操作,因为从上面的操作可以看出,我们保证了Arr的有序性,所以我们就可以用二分查找来完成。笔者这里使用的是STL中的lower_bound函数,它返回的是第一个满足大于等于x的数的位置,而因为我们这里是求最长不下降子序列,所以我们还要用一个while来找到第一个大于x的数的位置。

那么第二问怎么求呢?

其实,第二问就是求最长上升子序列的长度(正序的)。具体方法和上面一样,只是不要取等。这里讲一下为什么。

我们根据最长上升子序列的性质并结合本题特征可以知道,最长上升子序列的中的每一个元素一定就是每一个系统最后打的那一个导弹,这可以由反证法得知。

代码

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std; const int maxN=200;
const int inf=2147483647; int n;
int Height[maxN];
vector<int> Arr; int main()
{
n=1;
while (cin>>Height[n])
n++;
n--;
Arr.clear();
vector<int>::iterator Find;
for (int i=n;i>=1;i--)//第一问,求倒序的最长不下降子序列
{
if ((Arr.size()==0)||(Arr[Arr.size()-1]<=Height[i]))//注意这里可以取等
Arr.push_back(Height[i]);
else
{
Find=lower_bound(Arr.begin(),Arr.end(),Height[i]);
while (*Find==Height[i])//这里的while是求出第一个大于Height[i]的
Find++;
*Find=Height[i];
}
}
cout<<Arr.size()<<endl;
Arr.clear();
for (int i=1;i<=n;i++)//第二问,求最长递增子序列
{
if ((Arr.size()==0)||(Arr[Arr.size()-1]<Height[i]))//注意这里不能取等
Arr.push_back(Height[i]);
else
{
Find=lower_bound(Arr.begin(),Arr.end(),Height[i]);
*Find=Height[i];
}
}
cout<<Arr.size()<<endl;
return 0;
}

Luogu 1020 导弹拦截(动态规划,最长不下降子序列,二分,STL运用,贪心,单调队列)的更多相关文章

  1. 动态规划——最长不下降子序列(LIS)

    最长不降子序列是这样一个问题: 下面介绍动态规划的做法. 令 dp[i] 表示以 A[i] 结尾的最长不下降序列长度.这样对 A[i] 来说就会有两种可能: 如果存在 A[i] 之前的元素 A[j] ...

  2. 动态规划 ---- 最长不下降子序列(Longest Increasing Sequence, LIS)

    分析: 完整 代码: // 最长不下降子序列 #include <stdio.h> #include <algorithm> using namespace std; ; in ...

  3. 【动态规划】【二分】【最长不下降子序列】洛谷 P1020 导弹拦截

    最长不下降子序列的nlogn算法 见 http://www.cnblogs.com/mengxm-lincf/archive/2011/07/12/2104745.html 这题是最长不上升子序列,倒 ...

  4. luogu P1020 导弹拦截 x

    首先上题目~ luogu P1020 导弹拦截 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都 ...

  5. 洛谷 P1020 导弹拦截(dp+最长上升子序列变形)

    传送门:Problem 1020 https://www.cnblogs.com/violet-acmer/p/9852294.html 讲解此题前,先谈谈何为最长上升子序列,以及求法: 一.相关概念 ...

  6. P1020 导弹拦截(nlogn求最长不下降子序列)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  7. 【动态规划+高精度】mr360-定长不下降子序列

    [题目大意] 韵哲君发现自己的面前有一行数字,当她正在琢磨应该干什么的时候,这时候,陈凡老师从天而降,走到了韵哲君的身边,低下头,对她耳语了几句,然后飘然而去. 陈凡老师说了什么呢,陈凡老师对韵哲君说 ...

  8. HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)

    6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...

  9. 【题解】Luogu P2766 最长不下降子序列问题

    原题传送门 实际还是比较套路的建图 先暴力dp一下反正数据很小 第一小问的答案即珂以求出数列的最长不下降子序列的长度s 考虑第二问如何做: 将每个点拆点 从前向后连一条流量为1的边 如果以它为终点的最 ...

随机推荐

  1. Erlang数据类型的表示和实现(3)——列表

    列表 Erlang 中的列表是通过链表实现的,表示列表的 Eterm 就是这个链表的起点.列表 Eterm 中除去 2 位标签 01 之外,剩下的高 62 位表示指向列表中第一个元素的指针的高 62 ...

  2. CentOS 6.7 安装配置 nagios

    一.简介    Nagios是一款开源的免费网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警,第一时间 ...

  3. 王者荣耀交流协会互评Beta版本及答复功能改进建议、Bug修正

    互评Beta版本 欢迎来怼团队博客园安卓APP Thunder团队爱阅app 探路者团队贪吃蛇 Hello World!团队项目空天猎 答复功能改进建议 答复其他各组给出的“就现有技术和工作量,不改变 ...

  4. No.1100_第九次团队会议

    在今天项目有了新的突破,大家的情绪明显高涨了一些,一改往日的颓丧.但是仍然还有很多功能没有完善,于是大家相互交流了一下自己的进度,列出还没有完善的部分,有些困难的部分一时解决不了,我们决定多人合作来解 ...

  5. 2-Seventh Scrum Meeting20151207

    任务分配 闫昊: 今日完成:完成数据库设计. 明日任务:和唐彬讨论接口如何在android实现. 唐彬: 今日完成:读了IOS讨论区后台接口. 明日任务:和闫昊讨论接口如何在android实现. 史烨 ...

  6. 20135316王剑桥 linux第六周课实验笔记

    6.存储器层次结构 6.1存储技术 1.如果你的程序需要的数据是存储在CPU寄存器中的,那么在执行期间,在零个周期内就能访问到它们.如果存储在高速缓冲中,需要1-10个周期.如果存储在主存中,需要50 ...

  7. delphi 图像处理 图像放大缩小

    procedure TDR_QM_ZP_Form.btn_FDClick(Sender: TObject); //图像放大 begin my_int1 := Trunc( my_int1 * 1.1) ...

  8. 【CSAPP笔记】3. 浮点数

    回想起刚学C语言时,我对浮点数的印象大概是"能够表示小数"的数据类型.还死记硬背过例如什么"小数用double存,用%f输出"这类的话.实际上呢,浮点数可以用这 ...

  9. Java 单生产者消费者问题

    package com.cwcec.test; class Resource { private int count = 0; private boolean flag = false; public ...

  10. C1WPF制作OLAP Cube浏览工具

    经过前期一段时间对WPF的学习了解,相信大家对WPF有了一定的了解.今天我们一起来了解使用Component One(简称C1)的WPF控件制作CUBE浏览工具.其实这个OLAP控件官方已经有了很详细 ...