在OJ上遇到这个题目,在网上寻找了很多关于这个问题的算法,经过20多次的提交实验,最后总算正确通过了。☺☺☺☺
题目要求如下:
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)
导弹的数量小于20
Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
Sample Input
8
389 207 155 300 299 170 158 65
4
8 9 5 6
Sample Output
2
2
经过层层修改后的代码如下:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int a[30001],dp[30001];
int n,i,inp,j,Max;
int main()
{
while(scanf("%d",&n)!=EOF && n)
{
Max=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[i]=1;
}
for(i=0;i<n;i++)
{
for(j=0;j<i;j++)
if(a[i]>=a[j] && dp[j]+1>dp[i])
dp[i]=dp[j]+1;
if(dp[i]>Max)
Max=dp[i];
}
printf("%d\n",Max);
}
return 0;
}
在网上找了几个大神写的代码,他们的实现格式与我们学校的OJ题目编译结果有冲突,修改了部分还是未能通过,但在这里写出来(已经修改过了),供大家参考。
第一个:
#include <iostream>
#include <string>
#include <algorithm>
#define MAX 100000
using namespace std;
int height[30000];
int top;
void arrange(int n)
{
sort(height,height+top+1);
for(int i=0;i<=top;i++){
if(height[i]>=n)
{
height[i]=n;
break;
}
if(i==top+1)
{
top++;
height[top]=n;
}}
}
int main()
{
int t;
while(cin>>t)
{
top=0;
height[0]=MAX;
int height;
for(int i=0;i<t;i++)
{
cin>>height;
arrange(height);
}
cout<<top+1<<endl;
}
return 0;
}
第二个:
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int N = 300000;
const int INF = ~0U>>1;
struct Node
{
int x,y;
};
Node a[N],t[N];
int d[N];
bool cmp(Node a,Node b)
{
return a.x < b.x || (a.x == b.x && a.y < b.y);
}
int Binary_Search(int l,int r,int x)
{
while(l < r)
{
int m = (l + r) >> 1;
if(x <= d[m]) r = m;
else l = m + 1;
}
return l;
}
int Work(Node a[],int n)
{
d[0] = -1;
int max = -1;
int len = 1;
for(int i=1;i<=n;i++)
{
d[len] = INF;
int j = Binary_Search(0,len,a[i].y);
if(j == len) len++;
d[j] = a[i].y;
}
return len - 1;
}
int main()
{
int n,T;
int w;
cin>>T;
while(T--)
{
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
t[n-i+1] = a[i];
w=Work(t,n);
}
cout<<w<<endl;
return 0;
}