第一问就是求最长不上升子序列的长度,要写O(nlogn)的算法。。。。

  对于这种nlogn的算法,只能求出长度,不能求出具体的序列。这种算法实现过程如下:

  我们定义len为到目前为止最长不上升子序列的长度,d[l]表示此长度为l的不上升子序列的末尾数据中最下的那个,a[i]为输入的第i个结果。先使d[1]=1,len=1。我们从i=2(i<=n)开始看:

  如果a[i]<=d[len],那么使d[++len]=a[i],即扩充一下目前的最长不上升子序列;

  否则,a[i]>d[len],就在数组d中从前往后找到第一个<a[i]的元素d[j],此时d[i1,2,...,j-1]都>=a[i],那么它完全可以接上d[j-1]然后生成一个长度为j的不上升子序列,而且这个子序列比当前的d[j]这个子序列更有潜力(因为这个数比d[j]大),所以就替换掉它就行了。

  第二问可由Dilworth定理(大致意思是一个数列分成不上升(或不下降)子序列的最小数=该数列的最长上升(或下降)子序列的长度)知该问是求最长上升子序列的长度。思路与第一问一模一样。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
int a[1000000],d[1000000];
void bss();
void ss();
int n;
int main()
{
          char ch=' ';
          while(ch==' ')
          {
                cin>>a[++n];
                ch=getchar();
          }
          bss();
          ss();
          return 0;
}

void bss()                           //求最长不上升子序列
{
         int len=1;
         d[len]=a[1];
         for(int i=2;i<=n;i++)
         {
                 if(a[i]<=d[len])
                 d[++len]=a[i];
                 else
                 {
                         for(int j=1;j<=len;j++)
                         if(d[j]<a[i])
                         {
                                 d[j]=a[i];
                                 break; 
                         } 
                 }
          }
         cout<<len<<endl;
}

void ss()                             //求最长不下降子序列
{
          int len=1;
          d[len]=a[1];
          for(int i=2;i<=n;i++)
          {
                 if(a[i]>d[len])
                 d[++len]=a[i];
                 else
                 {
                          if(a[i]!=d[len])
                          {
                                    for(int j=1;j<=len;j++)
                                    if(d[j]>=a[i])
                                     {
                                              d[j]=a[i];
                                              break; 
                                      } 
                           }
                  }
           }
            cout<<len;
}

导弹拦截 p1020的更多相关文章

  1. 导弹拦截p1020(LIS问题)

    题目描述(题目链接:https://www.luogu.org/problem/P1020) 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够 ...

  2. 【洛谷p1158】导弹拦截

    这道题是个有想法的枚举qwq 导弹拦截[题目链接] 注意:此导弹拦截非彼导弹拦截p1020 导弹拦截 一道题是1999年的,然后我们现在要写的是经过11年韬光养晦之后的导弹拦截 SOLUTION: 要 ...

  3. codevs1044 拦截导弹==洛谷 P1020 导弹拦截

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

  4. p1020导弹拦截

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

  5. 洛谷 P1020导弹拦截题解

    洛谷链接:https://www.luogu.org/problem/P1020 题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...

  6. luogu P1020 导弹拦截 x

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

  7. 【题解】P1020 导弹拦截

    [题解]P1020 导弹拦截 从n^2到nlogn 第二问就是贪心,不多说 第一问: 简化题意:求最长不下降子序列 普通n^2: for (int i = 1; i <= n; i++) for ...

  8. 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截

    先给出例题:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 大佬题解:P1020 [NOIP1999 普及组] 导弹拦截 - 洛谷 ...

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

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

随机推荐

  1. 前端框架之Vue(9)-组件基础&vue-cli

    组件基础 基本示例 这里有一个 Vue 组件的示例: <!DOCTYPE html> <html lang="en"> <head> <m ...

  2. warning: LF will be replaced by CRLF in 解决办法

    今天用Git bash遇到的问题,看了几个回答之后发现一个比较有价值的,给大家分享一下,其他很多的回答都有很或多或少存在一些弊端. 原回答地址在stackoverflow上,附上链接--http:// ...

  3. ppt 调整 页面 白色区域 大小

    1:  点击设计>大小 2:点击确保适合 3:成功

  4. nginx命令行参数

    通过控制台进入nginx目录后 1. 启动nginx start nginx 或 nginx.exe 2. 重启nginx nginx -s reload 3. 停止nginx nginx -s st ...

  5. (转)spring计划任务,springMvc计划任务,Spring@Scheduled,spring定时任务

    一.计划任务实现类 1.用@Component注解标识计划任务类,这样spring可以自动扫描 2.在方法中使用注解标识要执行的方法:@Scheduled(cron="*/30 * * * ...

  6. AOP 入门

    1,源码 Application.java package com.bf; import org.springframework.context.ApplicationContext; import ...

  7. 编译用到boost相关的东西,问题的解决;以及和googletest库

    编译https://github.com/RAttab/reflect, 发现需要gcc4.7以上的版本才行.于是编译安装最新的gcc-6.2.0, 过程算顺利. http://www.linuxfr ...

  8. jmeter二次开发----Loadrunner或Jmeter发送邮件报告

    Loadrunner支持Java Vuser,而Jmeter本身就是基于Java开发的,所以两者都可以通过JMail组件实现邮件发送.本人使用的是mail-1.4.7.jar,可以通过下载获得:htt ...

  9. Selenium基本使用(十二)测试报告生成

    报告目录结构 Reporter根目录 | |-------------LOGS |                                                | |         ...

  10. react native 初识生命周期

    关于生命周期这块,我是看到慕课堂的一个视频,觉得将的很好,引入很容易理解,地址是:https://www.imooc.com/video/14288  如果你们想了解一下,也可以去看看 RN 组件的生 ...