61003 - 拦截导弹

通过次数

9

提交次数

28

时间限制 : 1 秒
内存限制 : 128 MB

某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。

某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算最少需要多少套系统才能拦截所有导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。

输入

输入不确定个整数,表示每枚导弹的高度(高度可以为负,导弹可以在海里拦截),按来袭导弹的袭击时间顺序给出,以空格分隔。

输出

两行,每行包含一个整数

第1行数表示一套系统最多打多少导弹;

第2行数表示最少需要多少套系统才能拦截所有导弹。

样例

输入

9 6 7 8

输出

2
3

提示

第一问即经典的最长不下降子序列问题,可以用一般的DP算法,也可以用高效算法,但这个题的数据规模不需要。

用a[x]表示原序列中第x个元素,b[x]表示长度为x的不下降子序列的长度,当处理第a[x]时,可查找它可以连接到长度最大为多少的不下降子序列后(即与部分b[x]比较)。假设可以连到长度最大为maxx的不下降子序列后,则b[x]=maxx+1。b数组被赋值的最大值就是第一问的答案。

第二问用贪心法即可。每颗导弹来袭时,使用能拦截这颗导弹的防御系统中上一次拦截导弹高度最低的那一套来拦截。若不存在符合这一条件的系统,则使用一套新系统。