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

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

2个月前 (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),主要来自排序步骤,是效率较高的解法。


原创内容 转载请注明出处

分享给朋友:

相关文章

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

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

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

2024蓝桥杯国赛B组最小字符串题解:贪心算法实战应用(洛谷P10910代码解析)

2024蓝桥杯国赛B组最小字符串题解:贪心算法实战应用(洛谷P10910代码解析)

一、题目解读题目要求给定一个长度为N的字符串S和M个待插入字符,通过将这些字符全部插入S中,构造出字典序最小的新字符串。这是典型的字符串构造问题,考察选手对贪心算法的理解和应用能力。二、解题思路采用贪...

洛谷P12597题解:子序列查找的贪心与二分优化详解

洛谷P12597题解:子序列查找的贪心与二分优化详解

一、题目解读洛谷P12597题目要求在一个字符串s中寻找最长的子序列,该子序列需满足字符顺序与另一个字符串t相同。题目强调子序列无需连续,但字符相对位置需保持一致。例如,若t为"abc&qu...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

力扣1643题:第K小字典序路径(附C++代码与解题思路)

力扣1643题:第K小字典序路径(附C++代码与解题思路)

一、题目解读本题要求生成从原点(0, 0)到目标坐标(destination[0], destination[1])的路径中,字典序第K小的路径。路径仅由向下字符'V'(代表垂直移动)...

洛谷P3817题解:基于贪心算法的糖果分配优化策略

洛谷P3817题解:基于贪心算法的糖果分配优化策略

一、题目解读洛谷P3817题目要求处理n个盒子中的糖果分配问题:给定每个盒子的糖果数a[i]及限制值x,需通过吃掉部分糖果,确保任意相邻盒子(a[i-1] + a[i])的总和不超过x。输出最小需吃掉...

发表评论

访客

看不清,换一张

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