題目背景
戰爭已經進入到緊要時間。你是運輸小隊長,正在率領運輸部隊向前線運送物資。運輸任務像做題一樣的無聊。你希望找些刺激,於是命令你的士兵們到前方的一座獨木橋上欣賞風景,而你留在橋下欣賞士兵們。士兵們十分憤怒,因爲這座獨木橋十分狹窄,只能容納一個人通過。假如有兩個人相向而行在橋上相遇,那麼他們兩個人將無妨繞過對方,只能有一個人回頭下橋,讓另一個人先通過。但是,可以有多個人同時呆在同一個位置。
題目描述
突然,你收到從指揮部發來的信息,敵軍的轟炸機正朝着你所在的獨木橋飛來!爲了安全,你的部隊必須撤下獨木橋。獨木橋的長度爲L,士兵們只能呆在座標爲整數的地方。所有士兵的速度都爲1,但一個士兵某一時刻來到了座標爲0或L+1的位置,他就離開了獨木橋。
每個士兵都有一個初始面對的方向,他們會以勻速朝着這個方向行走,中途不會自己改變方向。但是,如果兩個士兵面對面相遇,他們無法彼此通過對方,於是就分別轉身,繼續行走。轉身不需要任何的時間。
由於先前的憤怒,你已不能控制你的士兵。甚至,你連每個士兵初始面對的方向都不知道。因此,你想要知道你的部隊最少需要多少時間就可能全部撤離獨木橋。另外,總部也在安排阻攔敵人的進攻,因此你還需要知道你的部隊最多需要多少時間才能全部撤離獨木橋。
分析:求每一個點最短的時間,那麼靠左的向左走,靠右的向右走,求出其中最大值即可。要求max呢,兩個士兵撞上以後立刻往回走,這和穿過對方,利用對方身份繼續走是一樣的道理。那麼直接求離兩個端點的最遠距離即可。
代碼:
const
maxn=10000;
var
a:array [0..maxn] of longint;
n,m,min,max:longint;
procedure init;
var
i,j:longint;
begin
readln(m,n);
if n<>0 then
begin
for i:=1 to n do
read(a[i]);
for i:=1 to n do
begin
if a[i]<(m+1-a[i]) then
j:=a[i]
else
j:=m+1-a[i];
if j>min then
min:=j;
if a[i]>(m+1-a[i]) then
j:=a[i]
else
j:=m+1-a[i];
if j>max then
max:=j;
end;
writeln(min,' ',max);
end
else
writeln('0',' ','0');
end;
begin
init;
end.