博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>
阅读量:5123 次
发布时间:2019-06-13

本文共 1822 字,大约阅读时间需要 6 分钟。

N - 导弹拦截

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都要高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹,同时,司令部想知道拦截下来的导弹的高度。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。

Input

第一行是一个整数t,代表case数。 对于每一个case,第一行是一个整数n(1n100000); 第二行是n个非负整数,表示第n枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。数据保证高度不会超过100000.

Output

对于每一个case,第一行输出最多能拦截的导弹数,第二行按来袭顺序输出拦截下来的导弹的高度构成的序列,以一个空格隔开。若有不止一种方法可以拦截最多的导弹,输出字典序最小的。

Sample input and output

Sample Input Sample Output
151 6 3 5 7
41 3 5 7

 

解题报告:

首先我们令 c[i] 表示长度为 i 的上升子序列中最后一位最小的.可以注意到,c数组是单调不减的,我们每次都可二分求解.

之后我们考虑如何输出答案,从后往前扫,依次匹配长度为 x ,x – 1 , x – 2 ….为结尾的上升子序列,每次需要前面一个数小于后面一个数即可.

 

#include 
#include
#include
#include
#include
using namespace std;const int maxn = 1e5 + 50;int h[maxn],n,c[maxn],maxlength,f[maxn];stack
s;/*贪心dp c[i] -> 长度为 i 的最长上升子序列中的最小的最后一位*/int main(int argc,char *argv[]){ int Case; scanf("%d",&Case); c[0] = 0; while(Case--) { memset(c,-1,sizeof(c)); scanf("%d",&n); for(int i = 0 ; i < n ; ++ i ) scanf("%d",h + i); c[1] = h[0] , maxlength = 1 , f[0] = 1; for(int i = 1 ; i < n ; ++ i) { int pos = lower_bound(c+1,c+maxlength+1,h[i]) - c; if (c[pos] == -1 || c[pos] > h[i]) c[pos] = h[i]; f[i] = pos; maxlength = max(maxlength,f[i]); } printf("%d\n",maxlength); int need = maxlength , pre = 1 << 20; for(int i = n - 1 ; i >= 0 ; -- i) //遍历 ,尽可能小 { if (f[i] == need && h[i] < pre) { need--; pre = h[i]; s.push(h[i]); } } printf("%d",s.top());s.pop(); while(!s.empty()) { printf(" %d",s.top()); s.pop(); } printf("\n"); } return 0;}

 

转载于:https://www.cnblogs.com/Xiper/p/4539652.html

你可能感兴趣的文章
php match_model的简单使用
查看>>
SIP服务器性能测试工具SIPp使用指导(转)
查看>>
回调没用,加上iframe提交表单
查看>>
大话文本检测经典模型:EAST
查看>>
待整理
查看>>
一次动态sql查询订单数据的设计
查看>>
C# 类(10) 抽象类.
查看>>
Vue_(组件通讯)子组件向父组件传值
查看>>
jvm参数
查看>>
STM32单片机使用注意事项
查看>>
swing入门教程
查看>>
好莱坞十大导演排名及其代表作,你看过多少?
查看>>
hihocoder1187 Divisors
查看>>
Azure 托管镜像和非托管镜像对比
查看>>
js window.open 参数设置
查看>>
032. asp.netWeb用户控件之一初识用户控件并为其自定义属性
查看>>
前端监控
查看>>
clipboard.js使用方法
查看>>
移动开发平台-应用之星app制作教程
查看>>
leetcode 459. 重复的子字符串(Repeated Substring Pattern)
查看>>