Java 导弹拦截系统优化:最小系统数计算
Java 导弹拦截系统优化:最小系统数计算
问题描述:
某国为了防御敌国的导弹袭击,开发出了一种导弹拦截系统。该系统有一个缺陷:虽然第一发炮弹能够到达任意高度,但后续每一发炮弹都不能高于前一发的高度。现有一组导弹来袭,每个导弹的高度已知。请计算拦截所有导弹所需的最小系统数量。
输入:
输入为 n 颗依次飞来的导弹高度(1 <= n <= 1000),每个高度为不大于 30000 的正整数。
输出:
输出为要拦截所有导弹最小配备的系统数 k。
解题思路:
- 使用一个
ArrayList来存储系统,每个元素表示一个系统,其值为该系统最后一发炮弹的高度。 - 对于每个导弹,遍历
ArrayList,如果存在一个系统可以拦截该导弹(即系统的高度不低于该导弹的高度),则将该导弹拦截在该系统上,并更新该系统的高度为该导弹的高度。 - 如果遍历完
ArrayList后都没有找到可以拦截该导弹的系统,则需要新增一个系统,将该导弹拦截在该系统上,并将该系统添加到ArrayList中。 - 最后
ArrayList的大小即为所需系统的数量。
代码实现:
import java.util.ArrayList;
import java.util.Scanner;
public class MissileInterceptor {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 导弹数量
ArrayList<Integer> systems = new ArrayList<>(); // 存储系统的 ArrayList
for (int i = 0; i < n; i++) {
int height = scanner.nextInt(); // 导弹高度
boolean intercepted = false; // 是否被拦截
// 遍历已有的系统,尝试拦截导弹
for (int j = 0; j < systems.size(); j++) {
if (systems.get(j) >= height) {
systems.set(j, height); // 更新系统高度
intercepted = true;
break; // 已经拦截,跳出循环
}
}
// 如果没有被拦截,则新增一个系统
if (!intercepted) {
systems.add(height);
}
}
System.out.println(systems.size()); // 输出系统数量
}
}
注意:
- 拦截导弹不一定是从第一个系统开始,而是选择可以拦截该导弹的第一个系统。
- 每个系统的高度都保持为该系统最后拦截的导弹的高度。
原文地址: https://www.cveoy.top/t/topic/odgd 著作权归作者所有。请勿转载和采集!