当前位置:首页 > 洛谷 > 洛谷P1007士兵过桥问题详解 C++贪心算法实现与优化

洛谷P1007士兵过桥问题详解 C++贪心算法实现与优化

3个月前 (06-04)

洛谷P1007士兵过桥问题详解 C++贪心算法实现与优化  C++算法 贪心算法 算法竞赛 第1张

题目解读

这道题目描述了一座长度为L的桥上有n个士兵,每个士兵每秒可以向左或向右移动1个单位。当士兵到达桥的端点(0或L+1)时离开桥。要求计算所有士兵离开桥的最小时和最大时间。

解题思路

  1. 最小时计算:每个士兵选择离自己最近的桥端离开,取所有士兵中最大的时间

  2. 最大时计算:考虑最极端情况,所有士兵都向同一个方向移动

  3. 使用贪心算法思想,无需考虑具体移动顺序

解题步骤

  1. 输入桥长L和士兵数n

  2. 处理n=0的特殊情况

  3. 读取并存储所有士兵位置

  4. 对士兵位置进行排序

  5. 计算最小时

  6. 计算最大时

  7. 输出结果

代码实现

#include<iostream>
#include<algorithm>
using namespace std;

int arr[5002][2]={0}; // 备用数组,本题未使用int soldier[5002]={0}; // 存储士兵位置的数组int main(){
    int L,n; // L:桥的长度,n:士兵数量
    cin >>L; // 输入桥的长度
    cin>>n; // 输入士兵数量
    
    // 处理没有士兵的特殊情况
    if(n==0){
        cout<<"0 0";
        return 0;
    }    
    // 读取每个士兵的位置
    for(int i=0;i<n;i++){
        int tmp;
        cin>>tmp;
        soldier[i]=tmp;
    }    
    // 对士兵位置进行排序
    sort(soldier,soldier+n);
    
    int out1=-1,out2=-1; // out1:最小时间,out2:最大时间
    
    // 计算所有士兵离开桥的最小时间中的最大值
    for(int i=0;i<n;i++){
        int now=soldier[i];        // 每个士兵可以选择向左或向右走,取较小值
        // 然后取所有士兵中的最大值
        out1=max(min(now,L+1-now),out1);
    }    
    // 计算所有士兵离开桥的最大时间
    // 即最左边的士兵向右走或最右边的士兵向左走的时间
    out2=max(L+1-soldier[0],soldier[n-1]);    
    // 输出结果
    cout<<out1<<" "<<out2;

    return 0;
}

总结

本题通过贪心算法巧妙解决了士兵过桥问题,关键在于理解最小时和最大时的计算原理,掌握排序预处理技巧,学会分析极端情况。该算法时间复杂度为O(nlogn),主要来自排序步骤,是效率较高的解法。


原创内容 转载请注明出处

分享给朋友:

相关文章

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

牛客13271题「删除K个数字的最小数」解题报告:贪心算法与栈的应用(附代码注释)

一、题目解读牛客13271题要求从给定的数字字符串中删除K个数字,使得剩余数字按原顺序排列后得到的最小数。题目核心在于如何在保持数字相对顺序的前提下,通过删除操作得到最优解。需注意结果字符串可能包含前...

LeetCode 54 螺旋矩阵 题解:螺旋矩阵的C++实现

LeetCode 54 螺旋矩阵 题解:螺旋矩阵的C++实现

一、题目解读LeetCode 54题“螺旋矩阵”要求将给定的二维矩阵元素按螺旋顺序(顺时针)排列为一维数组。例如,对于矩阵[[1,2,3],[4,5,6],[7,8,9]],输出应为[1,2,3,6,...

洛谷P10916题解:动态规划与数学优化的解题思路与代码实现

洛谷P10916题解:动态规划与数学优化的解题思路与代码实现

一、题目解读洛谷P10916题是一道典型的算法竞赛题目,要求根据给定的数列a,计算每个位置x对应的答案ans[x]。题目核心在于分析数列元素的特性,通过动态规划与数学优化策略,高效求解每个位置对应的答...

2020CSP-S动物园题解:位运算优化解法(洛谷P7076)

2020CSP-S动物园题解:位运算优化解法(洛谷P7076)

一、题目解读2020年CSP-S(中国计算机学会青少年信息学奥林匹克竞赛)的“动物园”题目(洛谷P7076)要求计算为满足饲养员对动物属性的要求,至少需要新增多少种动物。题目涉及二进制位运算与属性匹配...

力扣765题:情侣牵手问题的贪心解法

力扣765题:情侣牵手问题的贪心解法

一、题目解读力扣765题要求在一个座位数组中,每对情侣需相邻而坐。给定n对情侣的初始座位安排(偶数长度数组),需通过最小次数的交换操作,使所有情侣成为相邻座位。二、贪心算法完整代码class ...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。