拦截导弹 (vijos1303)dp + greedy

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
   输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
 
样例:
    INPUT                                               OUTPUT
    389 207 155 300 299 170 158 65     6(最多能拦截的导弹数)
                                                             2(要拦截所有导弹最少要配备的系统数)

原题链接>>

 

#include <iostream>
using namespace std;

const int MAX = 22
;

typedef 
struct

{
    
int
 height;
    
int
 lmax;
}
dd;

dd cc[MAX];
int
 xt[MAX];


int
 main()
{
    
int cnt,n = 0, i, kk = 0, result = 1
, tmax;
    
char
 rb;

    cin
>>
cc[n].height;
    cc[n].lmax 
= 1
;
    cnt 
= 0
;
    xt[cnt] 
= cc[0
].height;
    n
++
;

    
while(cin>>rb>>
cc[n].height)
    
{
        
//===============dp=======================

        cc[n].lmax = 1;
        
for(i = 0; i < n; i++
)
            
if(cc[i].height >=
 cc[n].height)
            
{
                
if(cc[i].lmax + 1 >
 cc[n].lmax)
                    cc[n].lmax 
= cc[i].lmax + 1
;
            }

        
if(cc[n].lmax > result)
            result 
=
 cc[n].lmax;

        
//
================dp========================

        
//=================greedy====================


        tmax 
= -1;kk = 0;
        
for(i = 0; i <= cnt; i++
)
            
if(xt[i] >=
 cc[n].height)
                
if(tmax == -1 || xt[i] - cc[n].height <
 tmax)
                
{
                    kk 
=
 i;
                    tmax 
= xt[i] -
 cc[n].height;
                }

        
if(tmax == -1)
            xt[
++cnt] =
 cc[n].height;
        
else

            xt[kk] 
= cc[n].height;
        
//================greedy========================

        n++;
    }

    cout
<<result<<","<<cnt<<endl;
    
return 0
;
}

posted on 2009-03-31 13:11  Xredman  阅读(427)  评论(0编辑  收藏  举报

导航