ALGO-13_蓝桥杯_算法训练_拦截导弹(贪心,DP)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

ALGO-13_蓝桥杯_算法训练_拦截导弹(贪⼼,DP)
问题描述
某国为了防御敌国的导弹袭击,发展出⼀种导弹拦截系统。

但是这种导弹拦截系统有⼀个缺陷:虽然它的第⼀发炮弹能够到达任意的⾼度,但是以后每⼀发炮弹都不能⾼于前⼀发的⾼度。

某天,雷达捕捉到敌国的导弹来袭。

由于该系统还在试⽤
输⼊导弹依次飞来的⾼度(雷达给出的⾼度数据是不⼤于30000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输⼊格式
⼀⾏,为导弹依次飞来的⾼度
输出格式
两⾏,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
样例输⼊
38920715530029917015865
样例输出
6
2
记:
由于关于贪⼼,DP类题⽬的解法不太熟悉,故上⽹搜寻
发现该题的⽤到了严格递减⼦序列,以及最长递增序列
学习到了新的思想
解题思路的来源:
AC代码:
1 #include <stdio.h>
2#define LEN 20
3#define MAX(X,Y) (X)>(Y)?(X):(Y)
4
5int main(void)
6 {
7int i = 0 ,j = 0;
8int sum = 0 , les = 0;/*sum->最多拦截数,les->⾄少需要的系统数*/
9int max,min;
10int mis[LEN+1] = {0} , up[LEN+1] = {0} , down[LEN+1] = {0};
11while (scanf("%d",&mis[i])!=EOF)
12 {
13 max = 0 , min = 0;
14 up[i] = 1;
15 down[i] = 1;
16for (j = 0 ; j < i ; j ++)
17 {
18/*最长递增序列判断*/
19if (mis[j]<mis[i] && up[j]>max)
20 {
21 max = up[j];
22 }
23/*最长递减序列判断*/
24if (mis[j]>mis[i] && down[j]>min)
25 {
26 min = down[j];
27 }
28 }
29 up[i] = max+1;
30 down[i] = min+1;
31 les = MAX(les,up[i]);
32 sum = MAX(sum,down[i]);
33 i ++;
34 }
35 printf("%d\n%d",sum,les);
36return0;
37 }。

相关文档
最新文档