题目描述:

为了对抗附近恶意国家的威胁,R国更新了他们的导弹防御系统。

一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。

例如,一套系统先后拦截了高度为3和高度为4的两发导弹,那么接下来该系统就只能拦截高度大于4的导弹。

给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。

输入格式

输入包含多组测试用例。

对于每个测试用例,第一行包含整数n,表示来袭导弹数量。

第二行包含n个不同的整数,表示每个导弹的高度。

当输入测试用例n=0时,表示输入终止,且该用例无需处理。

输出格式

对于每个测试用例,输出一个占据一行的整数,表示所需的防御系统数量。

数据范围

1≤n≤50

输入样例:

5
3 5 2 4 1
0

输出样例:

2

样例解释

对于给出样例,最少需要两套防御系统。

一套击落高度为3,4的导弹,另一套击落高度为5,2,1的导弹。

分析:

如果所有导弹防御系统拦截高度都是严格单调上升的,我们采取贪心的思路就是,如果所有系统的最小高度均不小于当前飞来导弹的高度,则新建一套系统;如果存在小于当前导弹高度的系统,则选择其中正确发射导弹高度最高的那个去击落该导弹。转换成LIS就是,如果当前上升子序列中所有序列的末元素均不小于遍历到的元素,则新建一个上升子序列;如果所有上升子序列中存在末元素小于遍历到的元素,则将该元素加到末字符最大的那个上升子序列的末尾。

如果所有导弹防御系统拦截高度都是严格单调下降的,贪心的思路就是,如果当前下降子序列中所有序列的末元素均不大于遍历到的元素,则新建一个下降子序列;如果所有下降子序列中存在末元素大于遍历到的元素,则将该元素加到末字符最小的那个下降子序列的末尾。

本题要求两类系统数总和最小。飞来一个导弹,我们不知道使用上升的导弹防御系统还是下降的导弹防御系统号,因此,只能都尝试下,采用dfs遍历每一种选择。需要注意的是,我们在选择将某个元素加到LIS末尾后,如果再要选择不加入LIS末尾,则需要恢复全局变量,以便加入到下降子序列末尾。

dfs的三个参数分别为:cur-当前遍历到的导弹高度,si-现有递增子序列的数量,sd-现有下降子序列的数量。

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 55;
int n,ans,a[N],f[N],g[N];
void dfs(int cur,int si,int sd){if(si + sd >= ans) return;//剪枝if(cur == n){//导弹击落完了ans = si + sd;return;}//选择上升导弹防御系统int j = 0;while(j < si && f[j] >= a[cur]) j++;int t = f[j];f[j] = a[cur];if(j >= si)  dfs(cur + 1,si + 1,sd);//新建一个上升导弹防御系统else    dfs(cur + 1,si,sd);//不新建系统f[j]= t;//恢复全局变量//选择下降导弹防御系统j = 0;while(j < sd && g[j] <= a[cur]) j++;t = g[j];g[j] = a[cur];if(j >= sd)  dfs(cur + 1,si,sd + 1);else    dfs(cur + 1,si,sd);g[j]= t;
}
int main(){while(cin>>n,n){for(int i = 0;i < n;i++)    cin>>a[i];ans = n;dfs(0,0,0);cout<<ans<<endl;}return 0;
}

AcWing 187 导弹防御系统相关推荐

  1. AcWing LIS相关问题 187 导弹防御系统

    ''' DFS枚举所有可能的元素放到上升序列或者下降序列的情况 '''ans = [0x7fffffff] # 最小序列总数 up = [0] * 60 # 上升序列的尾数数值 down = [0] ...

  2. 导弹防御系统[导弹拦截系统]

    导弹防御系统[dfs] 题目链接 引言(请忽略):今天是小白ACM集训的日子,然后数据结构实在是太难了,真是学不动了,然后就只能无助地去复习以前的题了,记得以前在SDUT程设二里面有一道题叫最少拦截系 ...

  3. C++---最长上升子序列模型---导弹防御系统(每日一道算法2023.3.5)

    注意事项: 本题的dp:"线性dp-最长上升子序列的长度" 本题的贪心(单调队列):"最长上升子序列模型-拦截导弹" 下面思路只讲如何运用这些东西来解这道题 强 ...

  4. 拦截导弹 导弹防御系统

    拦截导弹 & 导弹防御系统 拦截导弹 导弹防御系统 拦截导弹 题目链接:acwing1010. 拦截导弹 题目描述: 输入输出: 分析: 第一个问题为输出最长递减子序列,由于导弹数在1000以 ...

  5. 导弹防御系统,如何跟蜻蜓的大脑学习计算?

    来源:大数据文摘 作者:Frances Chance 多雨的夏季,蜻蜓最为常见,这些美丽的生物的飞行速度极快,狩猎能力也极为出色:蜻蜓狩猎的成功率捕获了高达95% ,它们一天可以吃掉数百只蚊子. 这种 ...

  6. 问题 : 导弹防御系统

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

  7. CG14导弹防御系统

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

  8. 【NOIP2013模拟】导弹防御塔

    题目 Freda的城堡-- "Freda,城堡外发现了一些入侵者!" "喵-刚刚探究完了城堡建设的方案数,我要歇一会儿嘛lala~" "可是入侵者已经 ...

  9. 信息学奥赛第十节 —— 贪心算法(渡河问题POJ 1700 Crossing River + 拦截导弹的系统数量求解)

    复习概念 贪心算法又叫贪婪算法,是指在对问题求解时,总是做出在当前看来是最好的选择.也就是说,贪心算法不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解. 无后效性:贪心算法不是对所有问题都 ...

  10. 会玩,有人用 Python 模拟导弹防御!

    作者:半壶砂 https://www.cnblogs.com/halfsand/p/7976636.html 最近中|东闹得凶,除了对某色列强烈谴责,最吸引眼球的要是他们的铁穹防御系统. 那如何用Py ...

最新文章

  1. zookeeperclient设置监听
  2. git 查看修改明细_git 查看指定文件的修改历史记录
  3. [转载]C#中各种计时器
  4. android support design library eclipse,Eclipse下使用Android Design Support Library中的控件
  5. 淘宝Hadoop现有测试框架探幽
  6. 删除归档_备份与归档的“罗生门”
  7. Python入门学习笔记(1)
  8. python下载哪个版本好-python下载哪个版本好
  9. socket长连接server c语言,使用socket建立长连接
  10. 如何使用记事本编译并运行Java源代码
  11. spring基础--注解配置ssm开发环境
  12. 浏览器上不去网络。需要进入ie点开Internet选项,网络中,局域网(LAN)设置,可以勾选上自动检测设置
  13. 【示波器专题】数字示波器的主要指标——带宽
  14. 计算机硬件的组装实践,论文-计算机硬件组装实践.doc
  15. CVPR2022点云语义分割:Stratified Transformer for 3D Point Cloud Segmentation
  16. gin embed打包静态资源文件
  17. 图像超分算法小合集二:FSRCNN、DRCN、RDN、EDSR
  18. python通过Tkinter库实现的一个简单的文本编辑器源码
  19. 负重阳光城之悬崖边的股价|一点财经
  20. 马云欲保留控制权 阿里或放弃香港上市

热门文章

  1. STC12C5A60S2的EEPROM应用
  2. MyExcel 2.1.3 发布,提供行级读取处理能力
  3. adjacent_diffenerce
  4. 超全详解2018 谷歌 I/O大会
  5. Python App 爬虫:豆果美食APP 菜谱爬取
  6. HTB-Unified
  7. LINUX未来的发展前景
  8. JTA transaction unexpectedly rolled back (maybe due to a timeout)
  9. 咖啡加盟10年经验分享:咖啡店12种危机处理方式,提升回头客
  10. AWS EFS vs EBS vs S3(差异和何时使用?)