首页 > 代码库 > nyoj 814 又见导弹拦截

nyoj 814 又见导弹拦截

又见拦截导弹

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述

大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统但是这种导弹拦截系统有一个缺陷它的第一发炮弹能够到达任意的高度但是以后每一发炮弹都不能超过前一发的高度。突然有一雷达捕捉到敌国的导弹来袭。由于该系统存在缺陷,所以如果想把所有的导弹都拦截下来,就要多准备几套这样的导弹拦截系统。但是由于该系统成本太高,所以为了降低成本,请你计算一下最少需要多少套拦截系统。

输入
有多组测试数据。
每组数据先输入一个整数N(N≤3000),代表有N发导弹来袭。接下来有N个数,分别代表依次飞来的导弹的导弹的高度。当N=-1时表示输入结束。
输出

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




方法一:时间为1084ms

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int dp[3005];
int data[3005];
int main()
{
    int n;
    while(scanf("%d",&n)&&n!=-1)
    {
     int i,j;
     for(i=0;i<n;i++)
        scanf("%d",&data[i]);
     dp[0]=1;
     for(i=1;i<n;i++)
     {
         dp[i]=1;
         for(j=0;j<i;j++)
            if(data[j]<data[i]&&dp[i]<dp[j]+1)
                dp[i]=dp[j]+1;
     }
     int maxn=dp[0];
     for(i=1;i<n;i++)
         if(maxn<dp[i])
             maxn=dp[i];
     printf("%d\n",maxn);
    }
    return 0;
}

方法二:时间为40ms

#include<stdio.h>
int main()
{
	int n,i,j,c,a[3000],dp[3000];
	while(1)
	{
		scanf("%d",&n);
		if(n==-1)break;
		for(i=0;i<n;i++)
			scanf("%d",&a[i]);
		dp[0]=a[0];
		c=1;
		for(i=1;i<n;i++)
		{
			for(j=0;j<c;j++)
				if(a[i]<=dp[j])
				{dp[j]=a[i];break;}
			if(j>=c)
			{dp[j]=a[i];c++;}
		}
		printf("%d\n",c);
	}
	return 0;
} 

方法三:

与方法二类似

只是采用了二分的思想来查找第一个比他大的

时间为36ms

#include<stdio.h>
#define MAX 3005

//二分查找,大于key的最小f[]的位置j
int UpBinarySearch(int *upF,int l, int r, int key)
{
	if (l<=r)
	{
		int mid = (l + r) / 2;

		if (upF[mid] >= key)
		{
			return UpBinarySearch(upF,l, mid-1, key);
		}
		else
		{
			return UpBinarySearch(upF, mid+1, r, key);
		}
	}
	else
	{
		return l;
	}
}

int main()
{
	int a[MAX];
	int f[MAX];
	int aUp[MAX];
    int k = 0;//length
	int i = 0, n=0;//loop

	//读入
	while(scanf("%d",&n)&&n!=-1)
	{
                        
	for (i=1; i<=n; i++)
	{
		scanf("%d",&a[i]);
	}
	//正着上升求序
	f[0] = -9999;
	k = 0;
	for (i=1; i<=n; i++)
	{
		if (f[k]<a[i])
		{
			f[++k] = a[i];
			aUp[i] = k;
		}
		else
		{
			int j = UpBinarySearch(f, 0, k, a[i]);
			f[j] = a[i];
			aUp[i] = j;
		}
	}
	printf("%d\n",k);
    }
	return 0;
}