• hdu1257最少拦截系统 贪心


      题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1257

       

    某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽
    然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷
    达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所
    有的导弹.
    怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救
    了,请帮助计算一下最少需要多少套拦截系统.

      这题白皮书上也有,他不是求最多拦截多少导弹(那样的话就是最长不下降子序列问题),而是求最少需要多少系统才能把导弹全部拦截下来,那么显然每一发导弹来临的时候我们都得把它拦截下来,如果一枚导弹来临的时候我们之前有一个系统拦截过的最后一个导弹把它高,那么就可以用这个系统来拦截它,吐过符合条件的有多个,显然用符合条件的系统里目前最低高度最小的那个拦截,因为其他最低高度比较高的还可以为拦截比当前导弹更高的导弹做准备。如果当前导弹很高,没有没有一个系统可以拦截下来,那就只能新开一个系统了。代码:

     1 //贪心 
     2 #include<iostream>
     3 #include<cstdio>
     4 using namespace std;
     5 const int maxn=10005;
     6 int n;
     7 int a[maxn];
     8 int f[maxn];
     9 int cnt; 
    10 int pos;
    11 bool flag;
    12 int main()
    13 {
    14     while(scanf("%d",&n)!=EOF)
    15     {
    16         cnt=0;
    17         for(int i=1;i<=n;++i)scanf("%d",&a[i]);
    18         for(int i=1;i<=n;++i)
    19         {
    20             int cha=10000000;
    21             flag=0;
    22             for(int j=1;j<=cnt;++j)
    23             {
    24                 if(f[j]>=a[i]&&f[j]-a[i]<cha)pos=j,flag=1,cha=f[j]-a[i]; 
    25             }
    26             if(flag)f[pos]=a[i];
    27             else f[++cnt]=a[i];
    28         }
    29         printf("%d
    ",cnt);
    30     }
    31     return 0;
    32 }
  • 相关阅读:
    新安装的CentOS 7不能上网
    修改机器名
    读书笔记-MySQL运维内参08-索引实现原理2
    读书笔记-MySQL运维内参08-索引实现原理1
    读书笔记-MySQL运维内参07-InnoDB数据存储结构
    MySQL 参数设置-持续更新
    读书笔记-Mycat权威指南-10-分片规则
    读书笔记-Mycat权威指南-09-全局序列号
    读书笔记-Mycat权威指南-08-Mycat中的Join
    读书笔记-Mycat权威指南-03-Mycat中的概念
  • 原文地址:https://www.cnblogs.com/yuelian/p/11900711.html
Copyright © 2020-2023  润新知