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

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

1个月前 (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,...

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

【牛客13256题解析】贪心算法优化题目组合问题:三元组与二元组的解题思路

一、题目解读牛客13256题要求处理一组题目难度数据,通过组合三元组(难度差≤20)或二元组(难度差≤10)来重新编排题目,计算需要补充的最小题目数量。题目本质是资源分配与优化问题,需高效组合现有题目...

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

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

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

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

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

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

发表评论

访客

看不清,换一张

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