题目位置

https://www.luogu.org/problemnew/show/P1020

题目描述

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

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

389 207 155 300 299 170 158 65

输出样例#1:

6

2

对于此题有贪心与dp两种思路

dp思路

对于dp思路,很容易看出,第一问就是最长不上升自序列。

最长上升子序列我们都可以瞬间写完,那最长不上升子序列怎么办??

1、一开始我的思路是反着存一个数组,用反着的数组找最长上升子学列就好了,然而实践证明,似乎不可行........(可能是我太菜,细节出了问题),但是你如果有兴趣可以试一下,再来打我的脸...。

2、下面就说可行的思路,将求上升子学列中的一个f数组增为两个,f用来存正数,另一个ff存f的相反数,这样判断时用f进行判断,找数时用ff查找(如果一脸懵逼也没关系,后面代码一目了然)。最后输出f长度就ok了。

第二问呢就是求一个最长上升子序列

证明也很简单,只要你的炮弹高度上升了,肯定就要建一个新炮台,这时最长的上升子学列才能保证每次增长都有炮台被建,所有跑一遍模板就好了。只要想明白了这个,这就是一道大水题了,哈哈哈哈!

dp代码

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int a[],f[],ff[],n;
int main()
{
while(cin>>a[++n]);//不多bb
n--;
int len=;
f[len]=a[];ff[]=-a[];//f数组用来存正的数,ff存其相反数
for(int i=;i<=n;++i)//最长不上升子学列
{
if(a[i]<=f[len])//判断时用f找更小的
{
f[++len]=a[i];
ff[len]=-a[i];//取反存入ff
}
else
{
int v=upper_bound(ff+,ff+len+,-a[i])-ff;//用ff寻找最大的比a[i]小的数
f[v]=a[i];
ff[v]=-a[i];
}
}
printf("%d\n",len);
memset(f,,sizeof(f));
memset(ff,,sizeof(ff));
len=;
f[]=a[];
for(int i=;i<=n;++i)//一遍最长上升子学列
{
if(a[i]>f[len]) f[++len]=a[i];
else
{
int v=lower_bound(f+,f+len+,a[i])-f;
f[v]=a[i];
}
}
printf("%d",len);//拜拜
return ;
}

贪心思路

对于第一问,我没有想出其他思路(尴尬qwq......)

对于第二问,我就有要说的

其实我也不知道我的思路算不算贪心了....就姑且起这个名字吧(总不能还叫dp)

第二问要求找出最少的炮台数,那我们就从第一个炮弹开始,如果这个炮弹不能被击落,就安装一架炮台,然后把后面的炮弹按照规则能打掉的标记为能击落(注意题目中说炮台所能击打的高度递减)。

然后知道所有炮弹都被标记为能击落,结束。

下面给予证明

9  1  2  5  3  2  9  1  

  对于以上数据,按照我们的思路先在9处安一架炮台,然后将1标记为可以被击落,结束这次查找。

  或许有人会问,用这座炮台打击5 3 2 1不是更划算吗??

  似乎是这样,但是我们设想,用9的这座炮台打掉了1,那么在2是再安一座,5时再按一座,下一个9时再安一座,总共4座。

  如果按照打掉5 3 2 1的方法,那么9时安一座,1时安一座,2时安一座,下一个9也要安一座,共4座。。。。。

  巧合????

  其实不是,因为如果你考虑打掉最多的,那么你躲开不打得那些总是要被击落的,只好他们自己再安一座,这时你似乎省掉了炮台,但实际并不。

  这个要考自己去感悟,其实与dp思路有异曲同工之妙。

贪心代码

 #include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int a[],n,f[],ff[],vis[],ans,js,zz;
int main()
{
while(cin>>a[++n]);
n--;
int len=;
f[++len]=a[];ff[len]=-a[];//从这到26行与dp思路相同,不多bb
for(int i=;i<=n;++i)
{
if(a[i]<=f[len])
{
f[++len]=a[i];
ff[len]=-a[i];
}
else
{
int v=upper_bound(ff+,ff+len+,-a[i])-ff;
f[v]=a[i];
ff[v]=-a[i];
}
}
printf("%d\n",len);
for(int i=;i<=n;++i)//从第一个开始扫
{
if(!vis[i])//用vis来记录是否被打掉
{
zz=a[i];ans++;//ans记录炮台数
for(int j=i;j<=n;++j)//将后面的vis更新
{
if(a[j]<=zz&&!vis[j])
{
zz=a[j];//zz用来存当前能击打的最高高度
vis[j]=; js++;//js用来记录被击落的炮弹数,便于结束循环
} }
}
if(js==n)//炮弹全部击落,输入答案,结束程序
{
printf("%d",ans);
return ;
}
}
return ;
}

如果有我瞎bb错的地方,欢迎指教订正!!!

[luogu1020][导弹拦截]的更多相关文章

  1. HDU-1257 导弹拦截系统 http://acm.hdu.edu.cn/showproblem.php?pid=1257

    Problem Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高 ...

  2. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

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

  3. 【codevs1044】导弹拦截问题与Dilworth定理

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

  4. TYVJ P1020 导弹拦截 Label:水

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

  5. bzoj2044: 三维导弹拦截

    Description 一场战争正在A国与B国之间如火如荼的展开. B国凭借其强大的经济实力开发出了无数的远程攻击导弹,B国的领导人希望,通过这些导弹直接毁灭A国的指挥部,从而取得战斗的胜利!当然,A ...

  6. nyoj 79 导弹拦截

    点击打开链接 拦截导弹 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发 ...

  7. UESTC_导弹拦截 2015 UESTC Training for Dynamic Programming<Problem N>

    N - 导弹拦截 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit  ...

  8. [vijosP1303]导弹拦截(最长上升子序列转LCS)

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

  9. noip提高组1999 导弹拦截

    导弹拦截 背景 实中编程者联盟为了培养技术精湛的后备人才,必须从基础题开始训练. 描述 某国为了防御敌国的导弹袭击,研发出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任 ...

随机推荐

  1. cordova微信支付回调App闪退

    这是cordova版本太高,不兼容这个插件所导致的.解决方案是修改$your_project/plugins/cordova-plugin-wechat/scripts/android-install ...

  2. spring程序打包war,直接通过-jar启动,并指定spring.profiles.active参数控制多环境配置

    备注:spring boot有内嵌tomcat,jar项目可以用java -jar命令启动,war包也可以,且可以直接指定spring.profiles.active参数控制多环境配置 直接指定传参, ...

  3. 利用Python实现“指尖陀螺”,让你释放压力

    前言 利用Python实现“指尖陀螺”,让你释放压力 基本环境配置 版本:Python3 系统:Windows 相关模块:turtle 实现效果 不停点击键盘空格键,这个陀螺会慢慢加速,从而达到一个减 ...

  4. how to build an app with github

    how to build an app with github Building apps https://developer.github.com/apps/ demos https://githu ...

  5. pycharm 安装

    pycharm 1.模板 file->setting->Editor->file and code template->python script->右上方 #!/usr ...

  6. python设计模式第八天【装饰器模式】

    1.定义 使用包装的释放扩展类的功能,但是不使用继承 2.使用场景 3.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ def MyDecorat ...

  7. sql 保留2位小数/换行

    2.176544保留两位小数 1.select Convert(decimal(18,2),2.176544)  结果:2.18 2.select Round(2.176544,2) 结果:2.180 ...

  8. html5 表單屬性

    新的 form 属性: autocomplete novalidate 新的 input 属性: autocomplete autofocus form form overrides (formact ...

  9. jqGrid选中行、格式化、自定义按钮、隐藏

    获取选择一行的id: var id=$('#jqGrid').jqGrid('getGridParam','selrow'); 获取选择多行的id: var ids=$('#jqGrid').jqGr ...

  10. mybatis-spring-1.2.2.jar下载地址

    http://www.java2s.com/Code/Jar/m/Downloadmybatisspring120jar.htm