題面
N 個士兵們在長度 L 的獨木橋上,各有位置(可能重疊站),初始方向有兩種但未知,速度 1,走到 0 或 L+1 即下橋。
N <= L <= 5000
當行進中的士兵和另一個士兵相遇(方向相反的碰撞),則兩人都反向。
問所有士兵都下橋的最短或最長時間。
分析
碰撞反向這個過程可以直接變成兩人交錯通行,因爲士兵都是等同的,不存在問某個士兵何時下橋,而是所有士兵下橋,所以他們的身份是可以互換的。
這樣反向這個過程就可以忽略了,每個士兵走的最長的路即向兩端中的較大者,最短的路即向兩端中的較小者。對所有士兵而言,需要最後一個士兵下橋纔算結束,所以得到每一個士兵後,士兵間取的是max
代碼
#include <stdio.h>
#include<iostream>
#include<cstdlib>
#include<algorithm>
int pos[5005];
using namespace std;
int main()
{
int maxx = 0, minn = 0;
int L;
int n;
cin >> L>>n;
for (int i = 0; i < n; i++)cin >> pos[i];
for (int i = 0; i < n; i++)
{
maxx = max(max(pos[i], L + 1 - pos[i]),maxx);
minn = max(min(pos[i], L + 1 - pos[i]),minn);
}
cout << minn << " " << maxx;
return 0;
}