南狂小子 2024-07-25 13:07 采纳率: 88.9%
浏览 15
已结题

1373: 【提高】拦截导弹方案求解

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

  • 写回答

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中的vectorsort函数,确保编译器支持C++11或更高版本。

    这个解决方案满足了用户的需求,提供了完整的案例、编程实现,并给出了示例输入和示例输出。如果用户需要在其他编程语言中实现,或者需要进一步的优化和解释,请告知。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 8月1日
  • 创建了问题 7月25日

悬赏问题

  • ¥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软件做一下,有偿