• hdu 1257 最少拦截系统(贪心)


    题意:

    最少需要多少个拦截系统才能将所有的导弹拦截下来。

    思路:

    第1枚导弹一定需要第一个拦截系统,第2枚导弹如果比第1个高度高,则需要第二个拦截系统。

    考虑第i枚导弹,如果前i-1枚导弹的高度都比它小,则需要新的一个拦截系统,否则一定只需要之前的某个拦截系统,不需要新开一个拦截系统。

    原因是:假设最优方案中是为它新开了一个拦截系统,那么一定是之前的所有拦截系统都去拦截它后面的某些导弹去了,所以跳过了它。

    而我们完全可以让之前的某个拦截系统去拦截它,而新开的拦截系统去拦截后面的导弹。

    所以证明了:不需要新开一个拦截系统,只要之前所在比它高度大的导弹。

    那么要让哪个拦截系统去拦截它呢?找到所有拦截系统中可以拦截它的并且最后一次拦截的高度是小的那个。这样是最优的。

    开一个数组记录在最优的方案下每一个拦截系统最后一次拦截到的导弹高度。

    看代码。

    代码:

    int n;
    int h[100005];
    int d[100005];
    
    int main(){
        while(scanf("%d",&n)!=EOF){
            rep(i,1,n) scanf("%d",&h[i]);
            d[1]=h[1];
            int nc=1;
            rep(i,2,n){
                if(h[i]>d[nc]){
                    d[++nc]=h[i];
                }else{
                    int pos=lower_bound(d+1,d+1+nc,h[i])-d;
                    d[pos]=h[i];
                }
            }
            printf("%d
    ",nc);
        }
    
        return 0;
    }
  • 相关阅读:
    php rewrite 简单
    第十六章 复杂的抽像类结构 简单
    php数学函数 简单
    PHP PCLZIP压缩类的学习笔记 简单
    windows实战Git环境配置msysGit+TortoiseGit 简单
    配置php.ini支持图片exif信息 简单
    使用PHP连接POSTGRES数据库 简单
    jQuery Ajax 实例 全解析 简单
    第十六章 多态性(一) 简单
    C#委托与事件
  • 原文地址:https://www.cnblogs.com/fish7/p/4245243.html
Copyright © 2020-2023  润新知