C语言某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹
时间: 2023-02-13 17:02:14 浏览: 136
为了解决这个问题,我们可以使用贪心算法。
首先,将所有导弹的高度按照升序排序。然后,从最低的导弹开始,依次判断当前导弹能否被拦截。如果能够被拦截,则将计数器加1,并将当前导弹的高度设为下一发炮弹的最大高度。重复这个过程,直到所有导弹都被处理完。
具体实现方法如下:
```
#include <stdio.h>
#define MAX_MISSILES 1000 // 最多拦截导弹数
int main()
{
int missiles[MAX_MISSILES]; // 导弹高度数组
int n; // 导弹数
int max_height; // 下一发炮弹的最大高度
int count; // 拦截导弹数
// 读入导弹数据
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &missiles[i]);
}
// 按照升序排序
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (missiles[i] > missiles[j]) {
int temp = missiles[i];
missiles[i] = missiles[j];
missiles[j] = temp;
}
}
}
// 开始拦截
max_height = 0;
count = 0;
for (int i = 0; i < n; i++) {
if (missiles[i] > max_height) {
// 当前导弹能够被拦截
max_height = missiles[i];
count++;
}
}
printf("%d\n", count);
return 0;
}
```
上述代码的时间复杂度为 O(n^2),因为使用的是冒泡排序。如果希望提