博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1020导弹拦截
阅读量:4654 次
发布时间:2019-06-09

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

题目描述

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

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

输入输出格式

输入格式:

一行,若干个整数(个数少于100000)

输出格式:

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

输入输出样例

输入样例: 
389 207 155 300 299 170 158 65
输出样例:
62 solution: 这题是dp的基础题了,学过dp的应该都见过。就是求最长不下降子序列长度和最长上升子序列长度。 我们记f[i]为以i为最后一个数的时候的最优方案。并且记一个best[i]存储更新。每当有一个h[i]时,更新掉之前一个比它大的最后一个数,当前答案不变。 可能没有说得很清楚,所以直接上代码: 代码:
1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 using namespace std; 8 int n,m,ansa,ansb; 9 int h[100010],best[100010],d[100010];10 int fia(){11 int l,r,mid,cnt=0,ans;12 int i,j;13 memset(best,0,sizeof(best));14 best[++cnt]=h[1];15 for(i=2;i<=n;++i){16 if(h[i]<=best[cnt]) best[++cnt]=h[i];17 else{18 l=1;r=cnt;19 while(l<=r){20 int mid=(l+r)>>1;21 if(best[mid]
d[cnt]) d[++cnt]=h[i];39 else{40 l=1;r=cnt;41 while(l<=r){42 mid=(l+r)>>1;43 if(d[mid]>=h[i]){44 r=mid-1;ans=mid;45 }46 else l=mid+1;47 }48 d[ans]=h[i];49 }50 }51 return cnt;52 }53 int main(){54 n=0;55 while(scanf("%d",&h[++n])==1);56 n--;57 printf("%d\n",fia());58 printf("%d\n",fib());59 return 0;60 }
View Code

 

 

转载于:https://www.cnblogs.com/lazytear/p/7760271.html

你可能感兴趣的文章
jmeter控制器--交替控制器
查看>>
hdu 5365 Run
查看>>
[Angular] Configurable NgModules
查看>>
各种类型的段以及段中存储子句的优先级
查看>>
Json返回通用对象,工具类
查看>>
featurized image pyramids
查看>>
SQLHelper.cs
查看>>
JZOJ 4742. 单峰
查看>>
博弈论题目总结(三)——组合游戏进阶
查看>>
Flash AS3 踪迹效果 拖尾效果[转]
查看>>
MySQL5.7 查询用户,配置IP限制
查看>>
阻止继承的思路,屏蔽友元类
查看>>
详细的字符设备驱动
查看>>
动态规划算法--01背包问题
查看>>
Struts2框架使用(九)之struts2的验证框架
查看>>
Array去重探究
查看>>
SQL判断某列中是否包含中文字符、英文字符、纯数字
查看>>
状压DP
查看>>
Java数据结构和算法(十五)——无权无向图
查看>>
守护进程(Daemon)
查看>>