独木桥 - 洛谷https://www.luogu.com.cn/problem/P1007
思路:
-
输入部分:
- 首先读取独木桥的长度
L
和初始留在桥上的士兵数目N
。 - 然后通过循环读取每个士兵的初始坐标并存储在
soldiers
数组中。
- 首先读取独木桥的长度
-
计算最小时间和最大时间:
- 对于每个士兵,通过
min(soldiers[i], L + 1 - soldiers[i])
计算其到桥两端的最短距离,然后取这些最短距离中的最大值作为整个部队撤离独木桥的最小时间的可能值。这是因为只要有一个士兵需要较长时间才能到达桥端,那么整个部队的最小撤离时间就取决于这个士兵。 - 类似地,通过
max(soldiers[i], L + 1 - soldiers[i])
计算每个士兵到桥两端的最长距离,再取这些最长距离中的最大值作为整个部队撤离独木桥的最大时间的可能值。这是因为所有士兵都以最慢的速度(即走到离自己最远的桥端)撤离时,所花费的时间就是最大时间。
- 对于每个士兵,通过
-
输出结果:
- 最后按照要求输出最小时间和最大时间,中间用空格隔开。
代码:
#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;
}