NYIT 841 又见拦截导弹

又见拦截导弹


时间限制:3000 ms  |  内存限制:65535 KB


描述

大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹


拦截系统但是这种导弹拦截系统有一个缺陷它的第一发炮弹能够到达任意的高度但是以后每一发炮弹都不能超


过前一发的高度。突然有一雷达捕捉到敌国的导弹来袭。由于该系统存在缺陷,所以如果想把所有的导弹都拦截


下来,就要多准备几套这样的导弹拦截系统。但是由于该系统成本太高,所以为了降低成本,请你计算一下最少需要


多少套拦截系统。

输入
有多组测试数据。

每组数据先输入一个整数N(N≤3000),代表有N发导弹来袭。接下来有N个数,分别代表依次飞来的导弹的导弹的

高度。当N=-1时表示输入结束。
输出

每组输出数据占一行,表示最少需要多少套拦截系统。
样例输入

8
389 207 155 300 299 170 158 65
5
265 156 123 76 26
样例输出

2
1


注意 :一套拦截系统发射导弹的时间,个数没有限制,可以是所给数据的的第一个和最后一个。所以求出一组数据有多少递减子序列,每求出一组递减子序列就对其元素进行标记一下,防止重复。

 
<span style="font-size:18px;">#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[3001],book[3001];//book数组进行标记
int main()
{

    int n,i,j,m;
    while(~scanf("%d",&n))
    {
        if(n == -1) break;
        memset(a,0,sizeof(a));
        memset(book,0,sizeof(book));
        for(i = 1; i<=n; i++)
            scanf("%d",&a[i]);
        int s = 0;
        for(i = 1; i<=n; i++)
            if(book[i] == 0)
            {</span>
               <span style="font-size:18px;">     book[i] = 1;
                m = a[i];//记录每个递减序列的当前最小值
                for(j = i+1; j<=n; j++)
                    if(a[j]<=m&&book[j] == 0)
                    {
                        book[j] = 1;
                        m = a[j];//更新
                    }
                s++;//累加递减子序列的个数
            }
        printf("%d\n",s);
    }
    return 0;
}
        </span>


你可能感兴趣的:(NYIT 841 又见拦截导弹)