码迷,mamicode.com
首页 > 其他好文 > 详细

47 最少拦截系统

时间:2020-03-29 01:01:10      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:维数   while   有一个   center   flag   rem   out   空格   clu   

47 最少拦截系统

作者: xxx时间限制: 1S章节: 一维数组

问题描述 :

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

某天,雷达捕捉到敌国的导弹来袭,如果系统数量太少,将导致有可能不能拦截所有的导弹。所以,根据雷达捕捉到的导弹高度,需要预先准备相应数量的拦截系统。

 

比如导弹的高度依次为:

5 3 4 2 4 1

则一个拦截系统的第一发炮弹必须打到高度5的地方,第二发炮弹打到高度3的地方。

但第三发炮弹打不到高度4的地方(因为每一发炮弹不能达到前一发的高度),所以要使用第二套拦截系统。

第二套拦截系统发射的炮弹高度打到4和2的高度(实际上,要拦截高度为2的炮弹,使用第一套拦截系统或者第二套都可以),

第三套拦截系统发射的炮弹高度打到4和1的高度(实际上,要拦截高度为1的炮弹,三套拦截系统都可以)。

因此,总共需要三套拦截系统。

 

再比如导弹的高度依次为:

5 3 4 2 3 1

则一个拦截系统的第一发炮弹必须打到高度5的地方,第二发炮弹打到高度3的地方。

但第三发炮弹打不到高度4的地方(因为每一发炮弹不能达到前一发的高度),所以要使用第二套拦截系统。

第二套拦截系统发射的炮弹高度打到4的高度。

再要拦截高度为2的炮弹,使用第一套拦截系统或者第二套都可以,但考虑到后面还需要拦截炮弹,我们这里使用第一套拦截系统(为什么不能用第二套,自己想啦)。

再要拦截高度为3的炮弹,我们使用第二套拦截系统。

再拦截高度为1的炮弹,第一套和第二套系统都可以,我们就使用第二套吧。

因此,总共仅需要两套拦截系统,第一套拦截的是5 3 2,第二套拦截的是4 3 1。

 

请根据给定的高度数据,帮助计算一下最少需要多少套拦截系统。

 

 

输入说明 :

输入数据首先包括一个整数T (1<=T<= 100),,表示测试数据的组数。

每组测试数据的第一行是一个整数N(1<= N <= 1000),代表着导弹总个数(正整数), 接下来用N个数字代表着导弹依次飞来的高度,其中雷达给出的高度数据是不大于10000的正整数,用空格分隔。

输出说明 :

对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统。

每组输出占一行,行首与行尾无空格。

输入范例 :

2
8
389 207 155 300 299 170 158 65
5
100 50 200 300 400

输出范例 :

2
4

 

 

解题思路:这道题目一开始理解错了(其实根本没有理解)。正确的理解应当是这样的:

1、为了防御敌国的导弹袭击,该国设计了多套防御系统

2、这几套防御系统,随时待命(一直工作)

3、每套防御系统后一发炮弹都不能达到前一发的高度

4、最少需要多少套拦截系统

 

其中第二条隐藏的很深(或许是我理解能力有限),第二条是强调如果某套系统已经待命就不能重新启动工作,换句话说,

不可以从最大抵御高度从新开始。第三条关键,第四条是题目要求也是一个重要条件。第四条也就要求我们每次抵御炮弹

前都要将现有的每套防御系统排序(按照本轮可以抵御高度升序排列),为了不浪费,每次从最低抵御高度的防御系统

开始检索,如果满足防御要求(防御高度大于等于导弹高度),则不用新增防御系统,但是需要将导弹高度更新为本套系统

下一轮的抵御高度(满足第三个条件)。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <string.h>
 5 #include <ctype.h>
 6 
 7 #define maxn 1005
 8 
 9 int rec[maxn];
10 int ans[maxn];
11 void mySort(int ans[],int len);
12 int main(){
13     
14     int t,n,i,j;
15     scanf("%d",&t);
16     int len = 0;
17     while(t--){    
18         scanf("%d",&n);
19         //printf("n=%d\n",n);
20         len = 0;
21         for(i=1;i<=n;i++){
22             scanf("%d",rec+i);
23         }
24         ans[0] = rec[1];
25         len ++;
26         for(i=2;i<=n;i++){
27             int flag = 0;//默认需要新增系统
28             //监测每个炮弹之前将系统排序
29             mySort(ans,len);
30             for(j=0;j<len;j++){
31                 if(ans[j]>rec[i]){
32                     ans[j] = rec[i];
33                     flag = 1;
34                     break;
35                 }
36             }
37             if(flag == 0){
38                 ans[len++] = rec[i];
39             }
40         }
41         printf("%d\n",len);
42         
43         
44 
45     }
46     return 0;
47 }
48 
49 void mySort(int ans[],int len){
50     int i,j;
51     for(i=len-2;i>=0;i--){
52         for(j=0;j<=i;j++){
53             if(ans[j]>ans[j+1]){
54                 int temp = ans[j];
55                 ans[j] = ans[j+1];
56                 ans[j+1] = temp;
57             }
58         }
59     }
60 }

 

47 最少拦截系统

标签:维数   while   有一个   center   flag   rem   out   空格   clu   

原文地址:https://www.cnblogs.com/ManOK/p/12590370.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!