导弹拦截
  gBkHYLY8jvYd 2023年11月19日 10 0

[NOIP1999 普及组] 导弹拦截

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度,计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入格式

一行,若干个整数,中间由空格隔开。

输出格式

两行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

样例 #1

样例输入 #1

389 207 155 300 299 170 158 65

样例输出 #1

6
2

提示

对于前 导弹拦截_数据 数据(NOIP 原题数据),满足导弹的个数不超过 导弹拦截_#include_02 个。该部分数据总分共 导弹拦截_数据_03 分。可使用导弹拦截_ios_04 做法通过。
对于后 导弹拦截_数据 的数据,满足导弹的个数不超过 导弹拦截_#include_06 个。该部分数据总分也为 导弹拦截_数据_03 分。请使用 导弹拦截_#include_08 做法通过。

对于全部数据,满足导弹的高度为正整数,且不超过 导弹拦截_ios_09

此外本题开启 spj,每点两问,按问给分。


导弹拦截_ios_10:新增加一组 Hack 数据。



#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 1000010
using namespace std;
typedef long long ll;
ll a[maxn],n=1,dp1[maxn],dp2[maxn],len1,len2;
inline void write(ll x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
int main(){
	while(cin>>a[n]){
		n++;
	}
	n--,len1=1,len2=1;
	dp1[1]=a[1],dp2[1]=a[1];
	for(ll i=2;i<=n;i++){
		if(a[i]<=dp1[len1]){
			dp1[++len1]=a[i];
		}
		else{
			ll k1=upper_bound(dp1+1,dp1+len1+1,a[i],greater<ll>())-dp1;
			dp1[k1]=a[i]; 
		}
		if(a[i]>dp2[len2]){
			dp2[++len2]=a[i];
		}
		else{
			ll k2=lower_bound(dp2+1,dp2+len2+1,a[i])-dp2;
			dp2[k2]=a[i];
		}
	}
	write(len1);
	puts("");
	write(len2);
	return 0;
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月19日 0

暂无评论

推荐阅读
  gBkHYLY8jvYd   2023年12月09日   12   0   0 cii++数据
  gBkHYLY8jvYd   2023年12月10日   9   0   0 #include邻域灰度图像
  gBkHYLY8jvYd   2023年12月10日   16   0   0 #include数组i++
  gBkHYLY8jvYd   2023年12月08日   14   0   0 #includecii++
gBkHYLY8jvYd
作者其他文章 更多

2023-12-12

2023-12-11

2023-12-10

2023-12-10

2023-12-09

2023-12-08

2023-12-06

2023-12-06

2023-12-06