HDU 1257 最少拦截系统(下降子序列的条数)

题目地址:点击打开链接

思路:和HDU 1051差不多,只不过那道题事先得排序,这道题,直接动态规划就可以解决,不用用贪心,很多人会误认为每个导弹应该选能拦截它的系统中最低的那个,这样可以减少不必要的下降,其实刚开始开一个系统即可,随便降,遇到导弹拦截不住,再开一个就行,开系统的条件是之前所有的系统都拦截不住,每个系统都是随便降,举个简单的例子,1551,3,1550,其实没必要拦截1551,1550的是一个系统,拦截3的是一个系统,写点长的例子自己理解吧,总而言之,这道题就是求,下降子序列的条数

超时代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[10000],visit[10000];

int main()
{
    int n,i,k,max1,sum;
    while(scanf("%d",&n) != EOF)
    {
        memset(visit,0,sizeof(visit));
        k = 0;
        sum = 0;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        while(k < n)
        {
            max1 = 4000;
            for(i=0; i<n; i++)
            {
                if(!visit[i] && a[i] <= max1)
                {
                    max1 = a[i];
                    visit[i] = 1;
                    k++;
                }
            }
            sum++;
        }
        printf("%d\n",sum);
    }
    return 0;
}
AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int a[30000],b[30000];

int main()
{
    int n,i,j,k;
    while(scanf("%d",&n) != EOF)
    {
        k = 0;
        for(i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=0; i<n; i++)
        {
            for(j=0; j<k; j++)
            {
                if(a[i] < b[j])
                {
                    b[j] = a[i];//b数组保存的是每条系统目前的最低值
                    break;
                }
            }
            if(j == k)
            {
                b[k] = a[i];
                k++;
            }
        }
        printf("%d\n",k);
    }
    return 0;
}

大神地址: 点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值