题解:P1007 独木桥

独木桥 - 洛谷icon-default.png?t=O83Ahttps://www.luogu.com.cn/problem/P1007

思路:

  1. 输入部分

    • 首先读取独木桥的长度 L 和初始留在桥上的士兵数目 N
    • 然后通过循环读取每个士兵的初始坐标并存储在 soldiers 数组中。
  2. 计算最小时间和最大时间

    • 对于每个士兵,通过 min(soldiers[i], L + 1 - soldiers[i]) 计算其到桥两端的最短距离,然后取这些最短距离中的最大值作为整个部队撤离独木桥的最小时间的可能值。这是因为只要有一个士兵需要较长时间才能到达桥端,那么整个部队的最小撤离时间就取决于这个士兵。
    • 类似地,通过 max(soldiers[i], L + 1 - soldiers[i]) 计算每个士兵到桥两端的最长距离,再取这些最长距离中的最大值作为整个部队撤离独木桥的最大时间的可能值。这是因为所有士兵都以最慢的速度(即走到离自己最远的桥端)撤离时,所花费的时间就是最大时间。
  3. 输出结果

    • 最后按照要求输出最小时间和最大时间,中间用空格隔开。

代码:

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

int main() {
    int L, N;
    cin >> L;
    cin >> N;

    int soldiers[N];
    for (int i = 0; i < N; ++i) {
        cin >> soldiers[i];
    }

    int minTime = 0, maxTime = 0;

    // 计算最小时间和最大时间
    for (int i = 0; i < N; ++i) {
        // 计算每个士兵到桥两端的最短距离,取最大值作为最小时间的可能值
        minTime = max(minTime, min(soldiers[i], L + 1 - soldiers[i]));
        // 计算每个士兵到桥两端的最长距离,取最大值作为最大时间的可能值
        maxTime = max(maxTime, max(soldiers[i], L + 1 - soldiers[i]));
    }

    cout << minTime << " " << maxTime << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值