Problem Description
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹.
怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统.
Input
输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔)
Output
对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统.
Sample Input
8 389 207 155 300 299 170 158 65
Sample Output
2
最少拦截系统这个东西其实讲的是根据输入数据,依次寻找输入数据的最大生序列,
那么将ID定为先决条件,输入的数据定为决定因素,之后输出。
那么这要比上一题1160要简单得多,AC代码如下:
#include
#include
#include
#include
using namespace std;
int main()
{
int n;
//输入开始
while(cin>>n)
{
int b[100005]= {0};
//b数组中存储的是之前输入的数据中能够构成升序列中最后一个最大的数字(以id为先决条件)
int count=0;
//count 的大小说明的是b数组的元素个数,
同时也说明的是输入数据中到目前为止
能构成的生序列有多少个。
for(int i=0; i<n; i++)
{
int a;
bool flag=false;
cin>>a;
//这是对每个数据的输入,即导弹高度的输入;
for(int j=0; j<count; j++)
if( a < b[j] )
{
b[j] = a;
flag=true;
break;
}
//上面这段程序的意思是:
如果对于这些前面构造出来的升序列,
都不满足现在处理的数字的插入条件,
(即现在处理的数字比前面所生成的
生序列的任何一个最大值都要小),
那么下面这段程序,就给这个数字
独自创造一个升序列:
if(!flag)
{
b[count++]=a;
sort(b,b+count);
//这步排序很重要,不然会导致大小紊乱!
(比所在count 位置的元素大小,即比较最后每个升序列一个元素的大小。)
}
}
cout<<count<<endl;
}
return 0;
}
先决条件
决定因素
前驱;覆盖;