首页 > 编程知识 正文

P1020 NOIP1999 普及组 导弹拦截

时间:2023-05-04 11:53:41 阅读:177919 作者:1615

P1020 [NOIP1999普及集团]导弹拦截主题交流码1upper_bound和lower_boundAC码2汇总

本博客为正题截图

首先需要说明。 这个主题在AcWing中也有一模一样的主题,但是两个主题的数据范围不同:

AcWing:AcWing 1010 .拦截导弹

33558 www.Sina.com/: p 1020 [ noip 1999普及集团]导弹拦截

3358www.Sina.com/中的数据范围更广,本题提供了两个代码,第一个代码可以在AcWing上洛谷,而洛谷中的一半数据是http://www.com

交流电源线1 洛谷

f排列表示最初I个导弹中最长的不上升子序列的长度,最后对所有的f[i]取最大值即可

g序列存储了每个防伪系统的结尾导弹的高度,对于每个h序列的元素,有两种选择:建立新的防卫系统,或者连接某个系统的结尾

AC

# include cstdio # includealgorithmusingnamespacestd; const int N=100010; int f[N]; int g[N]; int h[N]; int n; int main () (while ) Scanf ) ' %d ',h[n]!=eof(n; int res=0; for(intI=0; i n; I () {f[i]=1; for(intj=0; j i; j ) if(h(j )=h (I ) ) f ) I )=max ) f ) I )、f(j )1); RES=max(RES,f[i] ); }printf('%dn ',res ); int cnt=0; for(intI=0; i n; I ) {int k=0; wile(kCNTg[k]h[I] ) k; g[k]=h[i]; if(k=cnt ) CNT; }printf('%dn ',cnt ); 返回0; } upper_bound和lower_bound在介绍第二个代码之前,首先介绍lower_bound和upper_bound。 使用示例请参考博客: STL-algorithm(2)

如果数组按升序排列:

lower_bound(begin,end,a )返回数组[begin,end]之间的TLE的地址,找不到返回end的地址

upper_bound(begin,end,a )返回数组[begin,end]之间的代码解释的地址,找不到返回end的地址

如果数组按降序排列:

lower_bound([begin,end,a,greaterint ) ) )返回数组(begin,end ) )之间的代码的地址

upper_bound([begin,end,a,greaterint ) )返回数组(begin,end ) )之间的第一个大于或等于a的地址,并返回end

注意:在使用这两个函数之前,必须确保数组是规则的

交流电源线2 第一个大于a

在这个问题中,数组的作用是用代码部分标记的。 请注意,根据数组的定义,这两个数组是规则的

简单地说,这个问题是最长的不上升序列的长度3358www.Sina.com/和最长的上升序列的长度3358www.Sina.com/

求最长上升序列的长度:

求这个序列的长度实际上是求这个系统能拦截多少导弹。 走后按顺序看导弹的高度,只有两种情况。

1 .此导弹的高度必须小于或等于f阵列末尾的高度,因此将此导弹的高度插入我们f阵列的末尾

2 .该导弹的高度大于f阵列末尾的高度,所以在f阵列中首先找到小于它的数。 在这里需要使用upper_bound在这个导弹的高度上替换找到的数量

为什么要替换? 设上述中的导弹高度为a,被替换的导弹高度为b。 那么,如果b在末尾的话,由于b a,在B后面能接的导弹的数量会比A少。 如果B在内部,B在有生之年绝对不会再使用,所以可以替换。 请注意,在进行上述所有操作的过程中,我们的f数组内部变得有序。 读者请想想为什么。

3358www.Sina.com/:求出了最长上升序列的长度。第一个小于或等于a

最长上升系列的长度:求法和思路与上述相同,但在此不多赘述

第一个小于a

# include iostream # includealgorithmusingnamespacestd; const int N=100010; int f[N]; //f数组包括最长不上升序列(注意不是子序列) int g[N]; //g数组中包含最长上升序列(注意不是子序列) int h[N]; int n; int main () while ) cinh[n]; n --; int res=1,cnt=1; f[1]=g[1]=h[1]; for(intI=2; i=n; I () if ) h ) I )=f[RES] ) f[ res]=h[i]; ELSE{intk=upper_bound(f1,f res 1,h[i],greaterint ) )- f; f[k]=h[i]; (if ) h ) I ) g ) CNT ) g ) CNT )=h ) I ); ELSE{intk=lower_bound(g1,g cnt 1,h[i] )- g; g[k]=h[i]; }printf('%dn%dn )、res、cnt ); 返回0; }总结才是浅学,第一次真正应用于lower_bound和upper_bound,真的好香。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。