拦截导弹 (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

ExpandedBlockStart.gifContractedBlock.gif
{
    
int
 height;
    
int
 lmax;
}
dd;

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


int
 main()
ExpandedBlockStart.gifContractedBlock.gif
{
    
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)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
{
        
//===============dp=======================

        cc[n].lmax = 1;
        
for(i = 0; i < n; i++
)
            
if(cc[i].height >=
 cc[n].height)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
{
                
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)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
{
                    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
;
}

转载于:https://www.cnblogs.com/Xredman/archive/2009/03/31/1425915.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值