第一问就是求最长不上升子序列的长度,要写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. cobbler自动安装操作系统

    cobbler介绍 快速网络安装linux操作系统的服务,支持众多的Linux发行版: Red Hat, Fedora,CentOS,Debian,Ubuntu和SuSE 也可以支持网络安装windo ...

  2. 字符串类型 str-->转义符-->字符串格式化-->占位符-->综合案例

    # ###字符串类型 str """ 用引号起来的就是字符串 三种引号:单引号 双引号 三引号 """ """ ...

  3. Devops路线

    自动化运维工具 Docker学习 .

  4. sap 创建odata服务,通过http向数据库 进行增删改查

    https://blog.csdn.net/stone0823/article/details/71057172 1:通过 事物码 se11 创建 数据库表  zemp.表 zemp中 含有empid ...

  5. Jmeter各参数含义

    1.聚合报告分析 Label:每个JMeter的element(例如HTTP Request)都有一个Name属性,这里显示的就是Name属性的值 #Sample:表示你这次测试中一共发出了多少请求, ...

  6. sklearn.svm.LinearSVC文档学习

    https://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html#sklearn.svm.LinearSVC 1 ...

  7. CentOS6.5 安装Storm集群

    1.首先安装依赖包 [root@Hadoop-NN-01 ~]# yum install uuid* [root@Hadoop-NN-01 ~]# yum install libuuid [root@ ...

  8. cocos2d JS-(JavaScript) 动态生成方法的例子

    function User(properties) { for (var i in properties) { (function (which) { var p = i; which["g ...

  9. cocos2d-x JS 四人麻将中的服务器位置与客户端位置转换相关

    前言:在写各类游戏编程中,都会遇到一个问题,就是位置问题,服务端的位置是与客户端的位置是不同的,这中间需要进行一个转化,客户端一套代码运行,不管是任何人登陆,该位置始终都是在屏幕正下方,所以这样就要进 ...

  10. 兼容PC和手机触摸代码

    测试环境:unity3d 4.6.1 using UnityEngine; using System.Collections; public class neccc : MonoBehaviour { ...