传统题 200ms 64MiB

【入门】导弹拦截

题目描述

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度,如果要 拦截所有导弹最少要配备多少套 这种导弹拦截系统。

输入格式

第一行一个整数 nn,表示导弹的个数;

第二行包含 nn 个用空格分割的整数 hih_i,表示导弹高度;

输出格式

输出一个数字,表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

8
389 207 155 300 299 170 158 65
2

提示

【样例解释 1】

  • 389:新建一套拦截系统,[389][389]
  • 207:拿之前的 389 来拦截,[207][207]
  • 155:拿之前的 207 来拦截,[155][155]
  • 300:新建一套拦截系统,[155,300][155, 300]
  • 299:拿之前的 300 来拦截,[155,299][155, 299]
  • 170:拿之前的 299 来拦截,[155,170][155, 170]
  • 158:拿之前的 170 来拦截,[155,158][155, 158]
  • 65:拿之前的 155 来拦截,[65,158][65, 158]
  • 总计 2 套 拦截系统就够了
请思考后再点击查看提示
  • 用一个数组维护当前有几套拦截系统,每个拦截系统的拦截高度是多少
  • 对于一个新的导弹,
    • 要么从原有的拦截系统里找一个来拦截,这个拦截系统的拦截高度必然不小于导弹高度,最好满足条件里拦截高度最小的那个
    • 要么新建一个拦截系统
  • 每个拦截系统的拦截高度,必然是一个单调上升的数组(思考为什么?)
  • 对于单调上升的数组,就可以利用二分查找

数据规模与限制

  • 1n1051 \le n \le 10^5
  • 1hi1051 \le h_i \le 10^5