1322:【例6.4】拦截导弹问题(Noip1999)
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。
【输入】
n颗依次飞来的高度(1≤n≤1000)。
【输出】
要拦截所有导弹最小配备的系统数k。
【输入样例】
389 207 155 300 299 170 158 65
【输出样例】
2
【提示】
输入:导弹高度: 4 3 2
输出:导弹拦截系统k=1
解析:
优先使用已有的拦截系统
在已有的系统内找上一次最低高度的拦截
已有拦截系统不能拦截,就新开一个系统拦截
详见代码:
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int cnt=0;
int h;
int main() {
while(cin>>h){
int k=0;//默认没有能拦截的
int mi=1e9;//能拦截的最小值
for(int i=1;i<=cnt;i++){//遍历已有系统
if (a[i]<mi&&a[i]>=h){//如果能拦截且别最小值小
mi=a[i];//更新最小值
k=i;//记录系统号
}
}
if (k==0){//没有能拦截的
cnt++;//新开个系统
a[cnt]=h;//记录最后一次拦截高度
}else{//有能拦截的
a[k]=h;//更新最后一次拦截高度
}
}
cout<<cnt;
return 0;
}