信息学奥赛一本通(C++版)1289:拦截导弹 打表

69 阅读1分钟

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

这道题可以打表来做,a存储每个导弹的高度,b用来存储能拦截的导弹个数,刚开始初始化为1,默认可以拦截一个导弹。

如果后面的值比前面的值小,后面能拦截的导弹数就是前一个能拦截的导弹数的个数+1。

用一个maxx维护最大导弹数。

image.png

#include<iostream>

using namespace std;

const int N=30010;
int a[N],b[N];//存储数组,打表数组
int maxx=0;
int main()
{

	int n=0;cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];	
		b[i]=1;
	}
	
    for(int i=1;i<=n;i++)
    {
		for(int j=1;j<=i-1;j++)
		{
			if(a[i]<a[j]&&b[i]<b[j]+1)b[i]=b[j]+1;
			if(b[i]>maxx)maxx=b[i];
		}
	}
     cout<<maxx<<endl;
	return 0;
}