zoukankan      html  css  js  c++  java
  • 线性状态动态规划 P1020 导弹拦截【最长上升子序列】

    题目

    https://www.luogu.com.cn/problem/P1020

     题目分析

    系统最多能拦截的导弹数量就是这个序列的最长不上升子序列;而需要的系统数量就是这个序列的最长不下降子序列

    方法一:使用贪心+二分(https://www.cnblogs.com/Jason66661010/p/13054793.html

    代码

    #include<iostream>
    #include<set>
    #include<cstdio>
    #include<algorithm>
    #include<functional>
    using namespace std;
    int list[100011];
    int main()
    {
        int len=0;
        while (cin >> list[len++]); len--;//注意这里的输入方式,使用scanf()的话由于数据最后没有回车,会超时
        multiset<int,greater<int> >out;//这里注意,greater<int>后面要有一个空格,不能与后面的>连起来
        multiset<int>out2;
        for (int i = 0; i < len; i++)
        {
            multiset<int, greater<int> >::iterator it=out.upper_bound(list[i]);
            if (it != out.end())out.erase(it);
            out.insert(list[i]);
    
            multiset<int>::iterator it2 = out2.lower_bound(list[i]);
            if (it2 != out2.end())out2.erase(it2);
            out2.insert(list[i]);
        }
        printf("%d
    ", out.size());
        printf("%d", out2.size());
    }

    最长上升序列:

    set<int>out;
    set<int>::iterator it = out.lower_bound(list[i]);

    最长不下降子序列:

    multiset<int>out;
    multiset<int>::iterator it = out.upper_bound(list[i]);

    最长下降序列:

    set<int, greater<int> >out;
    set<int>::iterator it = out.lower_bound(list[i]);

    最长不上升序列:

    multiset<int, greater<int> >out;
    multiset<int>::iterator it = out.upper_bound(list[i]);

  • 相关阅读:
    TreeView控件
    俄罗斯套娃
    c#文件操作
    c# 操作excle
    vs2010启动越来越慢解决方法
    c# 操作excle[转]
    c# 命名空间别名
    C# openfiledialog的使用
    c# 获取项目根目录方法
    jquery操作复选框(checkbox)的12个小技巧总结
  • 原文地址:https://www.cnblogs.com/Jason66661010/p/13113440.html
Copyright © 2011-2022 走看看