zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    CentOS
    Docker
    Chart的简单使用
    DataGridView中间插入数据行
    获取每个月的固定的第n个星期几
    设置只能开启一个程序实例
    DataContext与实体类
    Attribute
    Delegate
    Event
  • 原文地址:https://www.cnblogs.com/fish7/p/4245243.html
Copyright © 2011-2022 走看看