【题目描述】
独木桥的长度为L LL,士兵们只能呆在坐标为整数的地方。所有士兵的速度都为1 11,但一个士兵某一时刻来到了坐标为0 00或L + 1 L+1L+1的位置,他就离开了独木桥。每个士兵都有一个初始面对的方向,他们会以匀速朝着这个方向行走,中途不会自己改变方向。但是,如果两个士兵面对面相遇,他们无法彼此通过对方,于是就分别转身,继续行走。转身不需要任何的时间。
【输入格式】
第一行:一个整数L LL,表示独木桥的长度。桥上的坐标为1 … L 1…L1…L
第二行:一个整数N NN,表示初始时留在桥上的士兵数目
第三行:有N NN个整数,分别表示每个士兵的初始坐标。
【输出格式】
只有一行,输出2 22个整数,分别表示部队撤离独木桥的最小时间和最大时间。2 22个整数由一个空格符分开。
【输入样例】
4
2
1 3
【输出样例】
2 4
【说明/提示】
初始时,没有两个士兵同在一个坐标。
数据范围:N ≤ L ≤ 5000 N≤L≤5000N≤L≤5000。
【分析】
士兵相遇时转身为障眼法,该情况与相遇时继续向前走的性质相同,因此不用考虑转向,某个士兵下桥的最短时间即朝向距离出口最短的那个方向一直走直到下桥为止的时间,最长时间即朝向距离出口最远的那个方向一直走直到下桥为止的时间。由于要计算全部士兵下桥的时间,因此m i n minmin和m a x maxmax都是取最大值(相对)。
【代码】
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 5005;
int pos[N];
int n, L;
int resMin, resMax;
int main()
{
cin >> L >> n;
for (int i = 1; i <= n; i++) cin >> pos[i];
for (int i = 1; i <= n; i++)
{
//如果桥的长度为奇数并且士兵在中间那么无论往哪走花的最小时间都是一样的(而且是所有士兵中下桥花费时间最多的)
if (L & 1 && pos[i] == (L >> 1) + 1) resMin = resMax = (L >> 1) + 1;
//坐标在桥的左半部分的士兵
else if (pos[i] <= L >> 1)
{
//如果在左半部分,那么下桥的最短时间就是往左走,下桥时间即士兵的坐标
resMin = max(resMin, pos[i]);
//下桥的最长时间就是往右走,即桥的长度-士兵坐标+1
resMax = max(resMax, L - pos[i] + 1);
}
//坐标在桥的右半部分的士兵
else
{
//下桥的最短时间就是往右走
resMin = max(resMin, L - pos[i] + 1);
//下桥的最长时间就是往左走
resMax = max(resMax, pos[i]);
}
}
cout << resMin << ' ' << resMax << endl;
return 0;
}
版权声明:本文为m0_51755720原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。