做题感悟:这题思考了很久(动态规划是硬伤!),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 ; }