首页 > 其他分享 >P1020 导弹拦截

P1020 导弹拦截

时间:2024-05-26 21:23:28浏览次数:14  
标签:int tt mid 导弹 P1020 序列 拦截 else

原题链接:P1020 [NOIP1999 提高组] 导弹拦截 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
相当好的一道题,用于理解使用 [[狄尔沃斯定理(Dilworth 定理)]]
当然这个定理肯定不止这么简单。

第一问就是让求一个最大不上升子序列,如果用 DP 求解,将是 \(O(n^2)\) 的时间复杂度,而这道题数据范围极限为 \(10^5\),因此必须优化。

如果先放下优化想第二问的话,如果可以很快就可以想出来一种贪心。即维护一个序列,序列上每个值代表一个系统拦截到的最后一个导弹的高度 \(k_i\),每加入一个导弹(高度记为 \(h\)),就在序列中找到那个高度大于等于 \(h\) 的最小的 \(k_i\),如果没有这样的 \(k_i\) 就新加入一个系统 \(k_j\),高度即为 \(h\)。
为什么是最小?因为总有一个 \(k_i\) 会变成 \(h\),如果是最小的我们就可以尽量保持别的 \(k_i\) 尽可能的高,从而尽量拦截更多导弹,减少系统的使用个数。

上面说的这部分我们可以二分,维护一个单调不升的序列,这样如果没有符合的 \(k_i\),直接在序列末端加上即可。当然维护成单调不减也行见仁见智,但加入 \(k_j\) 的方式不同。而这个单调的序列可以用单调栈来维护。

这是贪心,可以证明,如果有非贪心方案的最优方案,一定可以通过导弹的调换,变成贪心方案。

我们第二位求的,实际上就是不升子序列最小划分,根据狄尔沃斯定理(Dilworth 定理),它的数目就等于求最长上升子序列的元素数量。而我们第一问求的是最长不升子数列,根据这个定理就相当于求上升子序列的最小划分。也就是说第一二问在这种意义上,解法是一样的。

这题在 Acwing 上是一个 Dp 题,但第二问也是这样做的,差别在于数据范围,Acwing 的容许 \(O(n^2)\) 的第一问做法。

而关于实际操作就看代码吧。

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 100010;

int n, m;
int g[N], cnt[N];
int q[N], tt; // 相当一个栈

int main()
{
    while (scanf("%d", &g[ ++ n]) == 1);
    n -- ;
    
    memset(q, 0x3f, sizeof q); // 防止意外的入栈
    tt = 0; // 相当于栈的指针 
    for (int i = 1; i <= n; i ++ ) 
    {
        int l = 1, r = tt;
        while (l < r)
        {
            int mid = l + r >> 1;
            if (q[mid] < g[i]) r = mid;
            else l = mid + 1;
        }
        
        // 如果说我二分不出来符合条件的,就只能新加一个了
        if (q[l] >= g[i]) q[ ++ tt] = g[i]; 
        else q[l] = g[i];
    }
    
    cout << tt << endl;
    
    memset(q, sizeof 0, sizeof q);
    tt = 0;
    for (int i = 1; i <= n; i ++ )
    {
        int l = 1, r = tt;
        while (l < r)
        {
            int mid = l + r >> 1;
            if (q[mid] >= g[i]) r = mid;
            else l = mid + 1;
        }
        if (q[l] < g[i] || tt == 0) q[ ++ tt] = g[i]; 
        else q[l] = g[i];
    }
    
    cout << tt << endl;
    
    return 0;
    
}

标签:int,tt,mid,导弹,P1020,序列,拦截,else
From: https://www.cnblogs.com/blind5883/p/18214302

相关文章

  • vue 请求拦截器 的响应拦截器有几种?
    解决方案1:使用axios的请求拦截器 importaxiosfrom'axios';axios.interceptors.request.use(function(config){//在发送请求之前做些什么config.headers!['Authorization']=`${Session.get('token')}`;returnconfig;},function(error......
  • MeterSphere BeanShell 前置脚本拦截请求,获取请求参数,加密后放回请求体
    在 BeanShell 前置脚本中拦截请求,获取请求参数,加密后放回请求头背景在测试小程序项目时,需要对post接口请求中的参数值拼成字符串,进行sha256加密,然后将加密好的字符串,存到请求头中。具体操作:这个场景就需要在前置处理器中使用 beanshell 进行请求拦截,对参数进行加密修改后,......
  • Mybaits使用SQL拦截器实现字符串修剪
    概述一般情况下,保存到数据库中的字符串类型的数据,我们一般都不希望它前后带着空格,类似于"哈哈哈"。在业务中,如果每一个保存到数据库中的SQL都去对字符串参数进行trim的操作,这是很繁琐的,且容易漏掉。解决方案使用Mybatis的拦截器,拦截每一个SQL,针对SQL中的字符串参数进行tr......
  • 登录拦截器
    对于管理系统或其他需要用户登录的系统,都需要登录验证,如果没有登录就不行进行相应的操作。SpringBoot通过实现HandlerInterceptor接口实现拦截器,通过实现WebMvcConfigurer接口实现一个配置类,在配置类中注入拦截器,最后再通过@Configuration注解注入配置。实现HandlerInt......
  • IceRPC之传入响应和拦截器->快乐的RPC
    作者引言.Net8.0下的新RPC很高兴啊,我们来到了IceRPC之传入响应和拦截器->快乐的RPC,基础引导,让自已不在迷茫,快乐的畅游世界。传入响应Incomingresponse了解如何演绎传入的响应。收到传入响应调用器invoker异步返回传入响应。该传入响应是由连接从对等点接收响应......
  • ASP.NET Core的全局拦截器(在页面回发时,如果判断当前请求不合法,不执行OnPost处理器)
    ASP.NETCoreRazorPages中,我们可以在页面模型基类中重载OnPageHandlerExecuting方法。下面的例子中,BaseModel继承自PageModel,是所有页面模型的基类。推荐方案:在BaseModel.cs中,重载OnPageHandlerExecuting方法(看下面代码中的注释):publicoverridevoidOnPageHandlerExecuting......
  • 谈谈 Spring 的过滤器和拦截器
    前言我们在进行Web应用开发时,时常需要对请求进行拦截或处理,故Spring为我们提供了过滤器和拦截器来应对这种情况。那么两者之间有什么不同呢?本文将详细讲解两者的区别和对应的使用场景。(本文的代码实现首先是基于SpringBoot,Spring的实现方式仅简单描述)1.过滤器1.1.......
  • 拦截器与过滤器
    拦截器介绍:主要用于拦截用户请求并作出相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、登录验证等。原理:所有的拦截器(Interceptor)和处理器(Handler)都注册在HandlerMapping中,SpringMVC中所有的请求都是由DispatcherServlet分发的......
  • Java拦截器(Interceptor)详细解析
    转载链接地址:https://www.cnblogs.com/xiaoyh/p/16444681.html一、拦截器概念讲解拦截器的概念之前,我们先看一张图: (1)浏览器发送一个请求会先到Tomcat的web服务器(2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源(3)如果是静态资源,会直接到Tomcat......
  • axios 拦截器实现原理
    Axios拦截器是Axios提供的一种强大功能,允许你在请求发送到服务器之前或响应返回客户端之前对其进行修改或处理。拦截器主要有两种:请求拦截器(requestinterceptors)和响应拦截器(responseinterceptors)。实现原理拦截器数组:Axios内部维护了两个数组,一个用于存储请求拦截器,另......