1373: 【提高】拦截导弹方案求解
内存限制:128 MB
时间限制:1.000 S
评测方式:文本比较
命题人:外部导入
提交:16
解决:3
题目描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:
虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入n个导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
比如:有8颗导弹,飞来的高度分别为
389 207 175 300 299 170 158 165
那么需要2个系统来拦截,他们能够拦截的导弹最优解分别是:
系统1:拦截 389 207 175 170 158
系统2:拦截 300 299 165
输入
两行,第一行表示飞来导弹的数量n(n<=1000)
第二行表示n颗依次飞来的导弹高度(导弹高度互不相等)
输出
第一行输出:要拦截所有导弹最小配备的系统数k
接下来k行分别输出每套系统拦截哪些高度的导弹
样例输入 复制
8
389 207 175 300 299 170 158 165
样例输出 复制
2
1:389 207 175 170 158
2:300 299 165
1373: 【提高】拦截导弹方案求解
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
2条回答 默认 最新
- 阿里嘎多学长 2024-07-25 13:16关注
以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:
问题分析与解决方案
这个问题是一个典型的贪心算法问题,目标是确定最少需要多少套导弹拦截系统来拦截所有导弹,同时满足每套系统拦截的导弹高度递减的条件。以下是详细的分析和解决方案:
1. 问题分析
- 输入:导弹的飞行高度列表,导弹数量 ( n )(( n \leq 1000 )),导弹高度为不大于30000的正整数。
- 输出:最少的拦截系统数量 ( k ),以及每套系统拦截的导弹高度列表。
2. 算法设计
- 步骤1:对导弹的高度进行降序排序。
- 步骤2:使用贪心策略,从最高的导弹开始,逐个分配到拦截系统中,直到当前导弹的高度低于前一个导弹的高度,此时开始新的拦截系统。
- 步骤3:记录每个拦截系统拦截的导弹高度。
3. 编程实现
以下是一个C++程序的示例实现:
#include <iostream> #include <vector> #include <algorithm> // 用于std::sort int main() { int n; std::cin >> n; std::vector<int> missiles(n); for (int i = 0; i < n; ++i) { std::cin >> missiles[i]; } // 对导弹高度进行降序排序 std::sort(missiles.begin(), missiles.end(), std::greater<int>()); int systems = 0; std::vector<int> currentSystem; std::vector<std::vector<int>> allSystems; for (int height : missiles) { if (currentSystem.empty() || height > currentSystem.back()) { // 如果当前导弹高度高于当前系统里的最后一个导弹,则加入当前系统 currentSystem.push_back(height); } else { // 否则,开始新的拦截系统 allSystems.push_back(currentSystem); currentSystem.clear(); currentSystem.push_back(height); } } // 添加最后一个系统 allSystems.push_back(currentSystem); systems = allSystems.size(); // 输出结果 std::cout << systems << std::endl; for (int i = 0; i < systems; ++i) { std::cout << i + 1 << ":"; for (int height : allSystems[i]) { std::cout << " " << height; } std::cout << std::endl; } return 0; }
4. 示例输入和输出
假设输入如下:
8 389 207 175 300 299 170 158 165
预期输出应该是:
2 1:389 207 175 170 158 2:300 299 165
5. 注意事项
- 这个程序假设输入数据是合理的,即导弹数量不超过1000,导弹高度是正整数且不大于30000。
- 程序使用了C++ STL中的
vector
和sort
函数,确保编译器支持C++11或更高版本。
这个解决方案满足了用户的需求,提供了完整的案例、编程实现,并给出了示例输入和示例输出。如果用户需要在其他编程语言中实现,或者需要进一步的优化和解释,请告知。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥15 有关类的报错,在模块里调用另一个模块的方法下的变量时出错
- ¥15 delphi7 HMAC_SHA256方式加密
- ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
- ¥15 下列c语言代码为何输出了多余的空格
- ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)
- ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
- ¥15 GD32H757的can通信配置
- ¥20 nist随机数测试的问题
- ¥20 帮我解决这个项目,thank you各位程序员
- ¥15 哪位能用ea软件做一下,有偿