题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257
题意:导弹拦截系统的炮弹只能一次比一次低,敌方有不同高度的导弹发射过来,问我们至少要多少个导弹拦截系统。
题解:我们用dp[ i ]来表示第i个导弹拦截系统炮弹的最大可达高度。
我们先初始化dp[ 1 ]为a[ 1 ],接下来我们跑一个 i=2->n 的for循环,看最小的dp是不是能拦截它,如果可以的话,将这个dp更新为a[ i ]的值。如果没有一个系统可以拦截它,那么我们需要新建一个系统,dp[ ++cnt ]=a[ i ].
这里的话就是要注意每跑一个i,就要对dp排序一次,这是由于上边所说的要找最小能够拦截导弹的系统。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <stack>
#include <list>
#include <map>
#define P(x) x>0?x:0
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef vector<int>:: iterator VITer;
const int maxN=1e3+5;
const int maxC=1e6+5;
int dp[maxN],a[maxN];
int n;
int cnt,flag;
void init()
{
sort(dp+1,dp+cnt+1);
flag=0;
}
int main()
{
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
cnt=0;
flag=0;
dp[++cnt]=a[1];
for(int i=2;i<=n;i++)
{
for(int j=1;j<=cnt;j++)
{
if(dp[j]>a[i])
{
dp[j]=a[i];
flag=1;
break;
}
}
if(!flag)
{
dp[++cnt]=a[i];
}
init();
}
printf("%d\n",cnt);
}
return 0;
}