做题感悟:这题思考了很久(动态规划是硬伤!),AC是借助另一个题的灵感。
解题思路:倒着寻找单调递增子序列,寻找与当前高度最接近的炮弹去拦截且比当前高度小,如果没有再开辟一个导弹拦截系统。
代码:
#include<stdio.h>
#include<iostream>
#include<map>
#include<string>
#include<string.h>
#include<stdlib.h>
#include<queue>
#include<algorithm>
using namespace std ;
const int MX = 300005 ;
int g[MX],b[MX] ;
int main()
{
int n ;
while(~scanf("%d",&n))
{
for(int i=0 ;i<n ;i++)
scanf("%d",&g[i]) ;
int r=0 ;
memset(b,0,sizeof(b)) ;
b[r++]=g[n-1] ;
for(int i=n-2 ;i>=0 ;i--)
{
int temp=-1 ;
int mx=MX+MX ;
for(int j=r-1 ;j>=0 ;j--) // 寻找最接近的
if(b[j]<g[i]&&g[i]-b[j]<mx)
{
mx=g[i]-b[j] ;
temp=j ;
}
if(temp!=-1)
b[temp]=g[i] ;
else b[r++]=g[i] ;
}
printf("%d\n",r) ;
}
return 0 ;
}
264

被折叠的 条评论
为什么被折叠?



