HDU 1257 最少拦截系统

题目链接~~>

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


 

 

 

你可能感兴趣的:(HDU 1257 最少拦截系统)