HDU 1257 最少拦截系统(贪心算法)

/*
HDU 1257
为了使得使用的拦截系统最少,自然是要考虑使用与当前高度最接近的系统拦截(应该是贪心算法)
*/
#include<stdio.h>
#define INF 0x7ffffff
#define MAXN 10000
int dp[MAXN];//dp[i]代表第i个
int main()
{
    int n,x,i,res,flag;
    int minh;               //minh最小高度差
    while(scanf("%d",&n)!=EOF)
    {
        res=0;// 记录导弹系统套数
        while(n--)
        {
            scanf("%d",&x);
            flag=0;//后用作判断 1为次炮弹可被已有系统拦截,0为需一套新系统拦截
            minh=INF;       //minh记录上一次下降的高度差为一个较大值
            for(i=0;i<res;i++)//构造循环与之前导弹系统比较  看是否需新系统
            {
                if(x<=dp[i]&&minh>dp[i]-x)//若x小于导弹当前拦截的高度且高度差最小
                {
                    minh=dp[i]-x;//将较低的高度差赋给minh
                    dp[i]=x;
                    flag=1;//若可被已有系统拦截则不需新系统 flag为1
                }
            }
            if(flag==0)
            {
                dp[res]=x;
                res++;//记录导弹个数
            }
        }
        printf("%d\n",res);
    }
    return 0;
}

这是贪心算法    得出的是递减序列

也可以用动态规划     从后往前求递增数列     等我看看再说

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值