HDU - 1257 最少拦截系统(思维+贪心)

题目链接https://vjudge.net/contest/347031#problem/I
在这里插入图片描述
分析
给定的顺序是导弹依次飞来的顺序。所以不能排序。
刚开始想着从第一个数开始,若后面的数小于前面的数说明系统依次都能打到。若某一个高度大于前面的高度,系统的数量就++。
举个例子:
在这里插入图片描述
5发炮弹依次打来。
对于1和2可以用一个拦截系统。
拦截系统1的最高拦截高度为炮弹2的高度。
对于炮弹3,需要重新开一个拦截系统2。
拦截系统2的最高拦截高度为炮弹4的高度。
对于炮弹5,若按照上述思想需要重新开一个拦截系统。
但是可以看出拦截系统1的高度就可以把炮弹5拦截了,不需要重新开新的拦截系统。
用拦截系统1拦截后,拦截系统1的最大高度缩小为炮弹5的高度。
代码

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+10;
int n,high[N];
int sum[N];
int main()
{
    while(~scanf("%d",&n))
    {
        for(int i=1; i<=n; i++)
            scanf("%d",&high[i]);
        int num=1;
        sum[1]=high[1];
        for(int i=1; i<=n; i++)
        {
            int f=0;
            for(int j=1; j<=num; j++)
            {
                if(high[i]<=sum[j])
                {
                    f=1;
                    sum[j]=high[i];
                    break;
                }
            }
            if(!f)
            {
                num++;
                sum[num]=high[i];
            }
        }
        printf("%d\n",num);
    }
    return 0;
}

在这里插入图片描述
最艰辛的日子,总是耐人寻味。

发布了165 篇原创文章 · 获赞 6 · 访问量 5048

猜你喜欢

转载自blog.csdn.net/lylzsx20172018/article/details/103585853