在kuangbin的DP专题里找到的,然而有点坑的是并不是用DP做的。。。此题用贪心才是正解啊~~,对于每一发导弹,若已经存在拦截系统,且可以拦截此导弹,那么重新开一台是没意义的,因为达到的效果和通过降低现有拦截系统高度来拦截所达到的效果是一样的,当然若拦截不了那就另当别论去开一台,问题是有多台可以降低高度那么选哪一台呢?答案当然是选高度最低的且能拦截此导弹的系统,这会为以后其他系统拦截留下余地。这就是贪心策略,然后拿vector统计一下就好,我写过的另一道贪心题比这道要简单,但思路有相似之处,可以看一下~~(PS:博客链接)。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
//freopen("in.in","r",stdin);
int n;
while(scanf("%d",&n)!=EOF)
{
vector<int> v;
while(!v.empty())v.pop_back();
for(int i=1;i<=n;i++)
{
int x;
scanf("%d",&x);
int flag=-1;
int min_n=50000;
for(int i=0;i<v.size();i++)
if(v[i]>=x&&v[i]-x<min_n)
{
min_n=v[i]-x;
flag=i;
}
if(flag==-1)
v.push_back(x);
else
v[flag]=x;
}
printf("%d\n",v.size());
}
return 0;
}