序:難度標籤是普及-,便以爲應該很是簡單,結果發現有一個彎半天沒繞過來,因此認爲這道題對於第一次作的人來說仍是非常比較有意義的。c++
題目描述:
長度爲len的橋上有n個士兵,你不知道他們的初始方向。已知每單位時間每一個士兵能走距離1,若是兩個士兵碰面則馬上轉身往回走,轉身不花費時間。問全部士兵離開橋(左右皆可離開)的最短與最長時間。markdown
思路:
最短期天然很簡單,每一個士兵的速度相同,那麼往同一個方向走的時候不會出現撞上的狀況。就讓在左邊的士兵都向左走,右邊的士兵都向右走。答案即是最中間的那個士兵走的時間(距離)。ui
重點:
問題在於最長時間。
最長時間天然使咱們但願士兵在橋上待的時間越長越好。
那麼若是往左走着撞上了向右走,向右走着又撞上了,再向左…那豈不是能呆好久?
可是若是在一個宏觀的視角看:我並不關心最後一個是誰,我關心的是最後的時間。那個士兵留到最後跟我沒有關係。spa
那好,若是這麼看,咱們再去看兩個士兵相遇會發生什麼。
如今有1,2,兩名士兵。1在7(位置編號)向右,2在8向左。如今1向右走,到8,撞上2,因而1回到7,2回到8。也就是說本來七、8各有一人,如今七、8依然各有一人。再看方向。
若是1沒有遇到2,應該走到8向右,2則走到7向左。
如今依然是位於8的士兵向右,位於7的向左,方向跟不掉頭時沒有區別。
既然不關心是誰,那麼跟相遇沒有掉頭有區別嗎?code
也有人會有這樣的疑問:假如間隔是奇數格吶?假如1在7,2在9,相向而行都要到8。可是按照上述說法,根據題意這是不成立的啊。由於兩個士兵不能在同一個格子上。
那麼畫個圖模擬一下。假如距離爲5,1在2,2在4。那麼——
口1口2口(空格用‘口’代替)
最長時間是4,1向右或2向左。這作不到嗎?讓能夠當作他們是同向走就好啊。效果是同樣的就好。string
最後附上代碼:it
/* About: luogu_P1007_獨木橋 Auther: kongse_qi Date:2017/04/21 */
#include <bits/stdc++.h>
#define maxn 5005
using namespace std;
int len, n, x[maxn];
void Init()
{
scanf("%d%d", &len, &n);
for(unsigned i = 0; i != n; ++i)
{
scanf("%d", &x[i]);
}
if(!n)//沒有士兵
{
printf("0 0");
exit(0);
}
return ;
}
int Minn()
{
int minn = 0;
for(unsigned i = 0; i != n; ++i)
{
minn = max(minn, x[i] > len+1-x[i] ? len+1-x[i] : x[i]);
}
return minn;
}
int Maxx()
{
sort(x, x+n);
return len-x[0]+1 > x[n-1] ? len-x[0]+1 : x[n-1];
}
int main()
{
Init();
cout << Minn() << " " << Maxx() << endl;
return 0;
}
自此結束。
箜瑟_qi 2017/04/21 10:40class