拦截导弹问题(
NOIP1999
)
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。
【
输入格式
】
n颗依次飞来的高度(1≤n≤1000).
【
输出格式
】
要拦截所有导弹最小配备的系统数k。
【
输入样例
】
missile.in
389 207 155 300 299 170 158 65
【
输出样例
】
missile.out
2
【
输入输出样例
】
输入:导弹高度: 7 9 6 8 5
输出:导弹拦截系统K=2
输入:导弹高度: 4 3 2
输出:导弹拦截系统K=1
【思路】怎样贪心呢?对于系统来说系统尽量开得少,对于每个系统拦截导弹来说,尽量拦截较高的导弹,因为一旦拦截很低的导弹就没法恢复高度了
所以开一个数组,记录每个系统能拦截的最低的导弹;然后每来一个导弹就要从已经开的系统中找出一个能拦截导弹的高度比他大的且差值最小的,因为你
不能让当前能拦截较高导弹的系统拦截这个导弹(我的语言表达能力也是醉了),你只需一个将将儿能拦住他的就行;如果能找到,修改这个系统能拦截的
最低高度,如果不能再开一个系统,将当前系统能拦截的导弹高度赋值给这个导弹的高度
爸爸不说了 直接上代码
【代码】
1 //拦截导弹问题 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 using namespace std; 6 const int MAXX=1009; 7 int Ssystem[MAXX],Height[MAXX];//每个系统当前拦截的最低高度,和每个导弹的高度 8 int n,num=1; 9 int main() 10 { 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) 13 scanf("%d",&Height[i]); 14 Ssystem[num]=Height[1]; 15 for(int i=2;i<=n;i++) 16 { 17 int Short=0; 18 for(int j=1;j<=num;j++) 19 { 20 if(Ssystem[j]>=Height[i])//找出一个能拦住当前导弹的系统 21 if(Short==0)Short=j; 22 else 23 if(Ssystem[Short]>Ssystem[j])//从能拦截的系统中找出一个能将将儿拦住的来(orz) 24 Short=j;//记录当前拦截导弹 25 } 26 if(Short==0)//找不到能拦截的系统 27 { 28 num++;//新开一个系统 29 Ssystem[num]=Height[i];//把新开的系统的高度修改为当前拦截的导弹的高度 30 } 31 else 32 Ssystem[Short]=Height[i];//能找到拦截的系统,修改它能拦截的高度 33 } 34 printf("%d\n",num); 35 return 0; 36 }