拦截导弹

题目链接

思路:

  第一个问题很好解决,就是最长不上升子序列,利用贪心 + 二分的dp就可以解决,这里给一个二分查找的函数
二分查找

 第二个问题是问给出的序列最少可以分成几个不上升子序列,其实这里有一个定理
由Dilworth 定理,不上升子序列的最小划分数为 a 的最长上升子序列长度。
所以第二个问题就转化为了求这个序列的最长上升子序列,其实如果要省事的话,可以把这个序列颠倒过来,然后就转化为第一个问题

code

#include <bits/stdc++.h>

using namespace std;

const int maxn = 100000 + 5;

int dp[maxn],a[maxn];
int n = 1;

void Solve()
{
    memset(dp, 0, sizeof dp);
    //先求最长不上升子序列
    int ans= 1;
    dp[ans] = a[1];
    for(int i = 2; i <= n; i++){
        if(a[i] <= dp[ans]) dp[++ans] = a[i];
        else{
            //找到第一个小于等于a[i]的数字
            int idx = lower_bound(dp + 1, dp + ans, a[i],greater<int>()) - dp;
            dp[idx] = a[i];
        }
    }
    cout<<ans<<endl;
}

int main()
{
    while(cin>>a[n]) n++;
    n--;
    Solve();
    //由Dilworth}Dilworth 定理,不上升子序列的最小划分数为 a 的最长上升子序列长度。
    reverse(a + 1, a + n + 1);
    Solve();
    return 0;
}
全部评论

相关推荐

03-10 00:15
已编辑
快手_测试开发(实习员工)
点赞 评论 收藏
分享
01-30 09:45
燕山大学 Java
喵_coding:这种直接跑就完事了 哪有毕业了才签合同 任何offer和三方都没有的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
# 一张图晒出你司的标语 #
4332次浏览 75人参与
# AI面会问哪些问题? #
27943次浏览 556人参与
# 开放七大实习专项,百度暑期实习值得冲吗 #
15255次浏览 221人参与
# 你的实习产出是真实的还是包装的? #
20238次浏览 342人参与
# 找AI工作可以去哪些公司? #
9157次浏览 235人参与
# 春招至今,你的战绩如何? #
65485次浏览 583人参与
# 米连集团26产品管培生项目 #
13360次浏览 285人参与
# 从事AI岗需要掌握哪些技术栈? #
9002次浏览 307人参与
# 中国电信笔试 #
32017次浏览 292人参与
# 你做过最难的笔试是哪家公司 #
33641次浏览 234人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
340840次浏览 2174人参与
# 哪些公司真双非友好? #
69618次浏览 289人参与
# 阿里笔试 #
178639次浏览 1316人参与
# 机械人避雷的岗位/公司 #
62704次浏览 393人参与
# 小马智行求职进展汇总 #
25133次浏览 80人参与
# 第一份工作一定要去大厂吗 #
14702次浏览 122人参与
# 金三银四,你的春招进行到哪个阶段了? #
22097次浏览 280人参与
# 为了减少AI幻觉,你注入过哪些设定? #
26258次浏览 310人参与
# 应届生第一份工资要多少合适 #
20690次浏览 86人参与
# 沪漂/北漂你觉得哪个更苦? #
9917次浏览 193人参与
# 聊聊你的职场新体验 #
336513次浏览 1895人参与
# HR最不可信的一句话是__ #
6300次浏览 114人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务