(Luogu) p1020导弹拦截

2024-03-20 17:32
文章标签 拦截 luogu 导弹 p1020

本文主要是介绍(Luogu) p1020导弹拦截,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

https://www.luogu.org/problemnew/show/P1020

dp的做法,复杂度是 O(n^2),只能得100分,一个dp求的是最长下降子序列长度,一个dp求的是最少有多少个最长不上升序列,

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int f[maxn];
int dp[maxn];
int main(){int n=0;int num=0;while(cin>>f[++n]){continue;}	n--;dp[1]=1;int res=0;for(int i=2;i<=n;++i){dp[i]=1;for(int j=i-1;j>=1;--j){if(f[j]>=f[i])	dp[i]=max(dp[i],dp[j]+1);}res=max(res,dp[i]);}cout<<res<<endl;memset(dp,0,sizeof(dp));num=0; for(int i=1;i<=n;i++){dp[i]=1; //初始化,dp[i]记录着要将第i个击落的最少系统(只考虑第i个 for(int j=1;j<i;j++)if(f[i]>f[j]&&dp[i]<dp[j]+1){ //第j个后面还有再布置一套新的要dp[j]+1个才能完成任务,如果//现在dp[i]已经大于等于这个数那就不需要更新了,dp[i]=max(dp[i],dp[j]+1) dp[i]=dp[j]+1;//必须再用新系统}	num=max(num,dp[i]); //更新必须用的系统数}
//	for(int i=1;i<=n;++i){
//		cout<<dp[i]<<' ';
//	}
//	cout<<endl;cout<<num<<endl;return 0;
} 

第二种方法是要用到dilworth定理,那就是,求一个序列里面最少有多少最长不上升序列等于求这个序列里最长上升序列的长度

用一个二分,复杂度就降到O(nlogn) (我也是看的洛谷题解的第一篇,想破脑袋也想不出来 dp+贪心

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
int h[maxn];
int f[maxn];
int main(){int n=0,ans1=0,ans2=0;while(cin>>h[++n]){continue;}	n--;f[0]=9e6+5;for(int i=1;i<=n;++i){//最长不下降序列长度 if(f[ans1]>=h[i]){f[++ans1]=h[i];//最长不上升序列的长度+1 }//f[x]代表长度为x的最大结点 else{int l=0,r=ans1;while(r>l){int mid=(l+r)/2;if(f[mid]>=h[i]){l=mid+1;}else	r=mid;} if(l!=0)	f[l]=h[i];}}cout<<ans1<<endl;	memset(f,-1,sizeof(f));	for(int i=1;i<=n;++i){//最长上升序列长度 if(h[i]>f[ans2]){f[++ans2]=h[i];//最长上升序列的长度+1 }//f[x]长度为x的的最小节点 else{int l=0,r=ans2;while(r>l){int mid=(l+r)/2;if(h[i]<=f[mid]){r=mid;}else l=mid+1;} f[l]=h[i];}} cout<<ans2<<endl;return 0;
}

 

这篇关于(Luogu) p1020导弹拦截的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/830223

相关文章

FHQ Treap模版(luogu P3369)

FHQ Treap模版(自用),带注释 #include<bits/stdc++.h>using namespace std;const int N=1e5+10;int n,root,idx;struct node{int l,r;int val,key,size;}tr[N];int getnew(int v){tr[++idx].val=v;//权值tr[idx].key=rand(

Interceptor拦截器无法拦截根目录的解决方法

今天发现了一个bug,首页home.jsp的某一个值是通过拦截器拦截所有页面,然后赋值的,然而我们的首页是通过index.jsp直接引用首页home.jsp代码(如下),拦截器无法拦截。 <%@ include file="./WEB-INF/jsp/home.jsp" %> 首先,第一个解决方法就是,将首页的引用文件改为跳转即可 <html><head><meta http-equiv

使用filter改变改变地址,但又不想被本过滤器再次拦截的方法

继承HttpServletRequestWrapper重写里面的方法 如果是servlet重写getRequestURI() 如果是spring mvc重写 getServletPath()  可以根据getDispatcherType()类确定是那种调度类型,一般客户端请求action,或controller都是REQUEST,controller跳转到页面是FORWARD。

Android 拦截Tablayout 点击事件

背景:特定需求,点击某一个tab时,直接跳转到其他页面,不做任何选中操作,如下图点击小视频要跳转而不是选中这个tab   思考:Tablayout是安卓官方提供的,内部的点击事件都在内部封装,没有暴露类似的回调接口让用户自己处理某个tab的点击事件, 但是通过看源码发现 每一个tab的点击事件其实是一个内部封装的继承自LinearLayout的一个TabView来触发的 看14

springboot中的请求过滤filter与拦截interceptor分析

首先我们要定义一个类,实现标准的过滤器 import lombok.extern.slf4j.Slf4j;import javax.servlet.*;import javax.servlet.annotation.WebFilter;import java.io.IOException;@WebFilter("/*")@Slf4jpublic class AuthFilter im

拦截通信助理,拦截小秘书技术

有人叫做空号识别,有人称为彩铃识别,磐石云通过嵌入软交换进行实时识别前期媒体 案例: 王总公司有20坐席的员工回访用户服务满意度业务,由于用户开通了语音秘书和通信助理,漏话提醒等等,坐席拨打时对方由AI助理接听,并没有做到有效的触达,从而产生了话费。 1、造成了王总通信成本高。 2、造成了团队效率低,高峰时通信助理占比30%,人工打给AI助手,员工不能完成业务指标。 技术分析: 1、大

进阶SpringBoot之 Shiro(3)实现登录拦截和用户认证

Config 配置类添加 Shiro 的内置过滤器 anon:无需认证就能访问 authc:认证才能访问 user:拥有“记住我”功能才能使用 perms:拥有对某个资源的权限才能访问 role:拥有某个角色权限才能访问 package com.demo.shirospringboot.config;import org.apache.shiro.spring.web.ShiroFil

Filter过滤器周期、Filter拦截过滤、Filter执行链

Servlet过滤器的概念: Servlet过滤器本身并不生成请求和响应对象,它只提供过滤作用。 Servlet过滤器能够在Servlet被调用之前检查Request对象,修改Request Header和Request内容。 在Servlet被调用之后检查Response对象,修改Response Header和Response内容。 Servlet过滤器负责过滤的Web组件可以是Ser

mpvue项目中基于flyio的拦截

在请求拦截器中执行异步任务 下面我们看一个例子:由于安全原因,我们需要所有的请求都需要在header中设置一个csrfToken,如果csrfToken不存在时,我们需要先请求一个csrfToken,然后再发起网络请求,由于请求csrfToken是异步的,所以我们需要在拦截器中执行异步请求,代码如下: 不知道为什么 官方文档的tokenFly 和 newFly 不统一一下 其实就是一个东西 容

dao设计(三),缓存AOP拦截处理的几个思考

当我们发现我们可以用事件通知的方式来巧妙的实现缓存更新时,接下来需要考虑的就是如何用aop拦截方法并设置一些常量配置的问题了。 1. 首先考虑一个问题,例如每个DO实体对应key及缓存时间等配置我们是在启动初始化时全部设置好呢?还是在启动后动态设置? 个人认为,数量小可以在初始化设置,当量比较大或者在运行时很好获取时,运行时获取也是一个不错的选择。在此次缓存框架缓存配置信息我们采用了运行时