大家对拦截导弹那个题目应该比较熟悉了,我再叙述一下题意:某国为了防御敌国的导弹袭击,新研制出来一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度。突然有一天,雷达捕捉到敌国的导弹来袭。由于该系统存在缺陷,所以如果想把所有的导弹都拦截下来,就要多准备几套这样的导弹拦截系统。但是由于该系统成本太高,所以为了降低成本,请你计算一下最少需要多少套拦截系统。
每组输出数据占一行,表示最少需要多少套拦截系统。
方法一:时间为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;
}#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;
}
nyoj 814 又见导弹拦截,布布扣,bubuko.com
原文:http://blog.csdn.net/ruzhuxiaogu/article/details/24886651