1720 - 导弹拦截

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

  

输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

题目输入

每笔测资一行:输入导弹依次飞来的高度,空格分隔,导弹数不超过1000。

题目输出

对于每笔测资,输出两行:

第1行: 1个整数,表示最多能拦截的导弹数。

第2行: 1个整数,表示要拦截所有导弹最少要配备的系统数。

输入/输出样例

题目输入

389 207 155 300 299 170 158 65

题目输出

6
2

提示

LIS

C语言解答

#include "stdio.h"
int main()
{
	int a[1000],V[1000],Z[1000];
	int i,j;
	int n=0;
	int M=0,max;
	char c;
	while(1)
	{
		if(scanf("%d",&a[n])==EOF)
			break;
		else
			n++;
		do
		{
			c=getchar();
			if(c=='\n')
				break;
			else
				scanf("%d",&a[n]);
			n++;
		}while(1);
		for(i=0;i<n;i++)
			V[i]=Z[i]=0;
		for(i=0;i<n;i++)
		{
			for(j=i+1;j<n;j++)
			{
				if(a[j]<=a[i]&&V[i]==V[j])
					V[j]++;
				if(a[j]>a[i]&&Z[i]==Z[j])
					Z[j]++;
			}		
		}
		max=M=0;
		for(i=0;i<n;i++)
		{
			if(V[i]>max)
				max=V[i];
			if(Z[i]>M)
				M=Z[i];
		}
		printf("%d\n%d\n",max+1,M+1);
		n=0;
	}
	return 0;
}

C++解答

#include<iostream>
#include<string>
#include<sstream>
#include<algorithm>
using namespace std;
//ifstream cin("missile.in");
//ofstream cout("missile.out");
const int N(1001);
int h[N],f[N],g[N];
int main()
{
    string s;
    while (getline(cin,s))
    {
        istringstream is(s);
        int n(0);
        while (is>>h[n]) n++;
        fill(f,f+n,1);
        for (int i=0;i<n;i++)
            for (int j=0;j<i;j++)
                if (h[j]>=h[i]) f[i]=max(f[i],f[j]+1);
        int ans(1);
        for (int i=1;i<n;i++) if (f[i]>ans) ans=f[i];
        cout<<ans<<endl;
        fill(g,g+n,1);
        for (int i=0;i<n;i++)
            for (int j=0;j<i;j++)
                if (h[j]<h[i])  g[i]=max(g[i],g[j]+1);
        ans=1;
        for (int i=1;i<n;i++) if (g[i]>ans) ans=g[i];
        cout<<ans<<endl;
    }
    return 0;    
}

提示

LIS

时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题