題目描述
突然,你收到從指揮部發來的信息,敵軍的轟炸機正朝着你所在的獨木橋飛來!爲了安全,你的部隊必須撤下獨木橋。
已知 獨木橋的長度爲 L ,士兵們只能呆在座標爲整數的地方。所有士兵的速度都爲 1 ,當一個士兵某一時刻來到了座標爲 0 或 L+1 的位置,他就離開了獨木橋。
每個士兵都有一個初始面對的方向,他們會以勻速朝着這個方向行走,中途不會自己改變方向。但是,如果兩個士兵面對面相遇,他們無法彼此通過對方,於是就分別轉身,繼續行走。(轉身不需要任何的時間)
因爲混亂,你已不能控制你的士兵。甚至,你連每個士兵初始面對的方向都不知道。此時,你想要知道你的部隊最少需要多少時間就可以全部撤離獨木橋。另外,總部也在安排阻攔敵人的進攻,因此你還需要知道你的部隊最多需要多少時間才能全部撤離獨木橋。
輸入格式
第一行:一個整數 L ,表示獨木橋的長度。橋上的座標爲 1… L
第二行:一個整數 N,表示初始時留在橋上的士兵數目
第三行:有 N個整數,分別表示每個士兵的初始座標。
輸出格式
只有一行,輸出 2 個整數,分別表示部隊撤離獨木橋的最小時間和最大時間。2 個整數由一個空格符分開。
輸入輸出樣例
輸入
4
2
1 3
輸出
2 4
說明/提示
初始時,沒有兩個士兵同在一個座標。
數據範圍 N ≤ L ≤ 5000。
思路:有一個很巧妙的轉化:兩個人面對面相遇後分別轉身,相當於都沒有轉身,用對方的身份走下橋
簡單代碼:
#include <iostream>
#include<algorithm>
using namespace std;
int main() {
int l, n;
while (cin >> l >> n) {
int x;
int M = 0, m = 0;
for (int i = 1; i <= n; i++){
cin >> x;
m = max(min(l + 1 - x, x), m);//所有士兵走下橋所需時間最小值中的最大值
M = max(max(l + 1 - x, x), M);//所有士兵走下橋所需時間最大值中的最大值
}
cout << m << ' ' << M << endl;
}
}
set() 應用代碼
#include<iostream>
#include<set>
using namespace std;
//set<int>mins,maxs;實現從小到大排序
set<int, greater<int> >mins,maxs;//實現從大到小排序
int minlen(int l, int x){
return x > l + 1 - x ? l + 1 - x : x;
}
int maxlen(int l, int x) {
return x > l + 1 - x ? x : l + 1 - x;
}
int main() {
int l; cin >> l;
int n; cin >> n;
int x;
for (int i = 0; i < n; i++) {
cin >> x;
mins.insert(minlen(l, x));
maxs.insert(maxlen(l, x));
}
//對於從小到大的 set
// mins.end() 中存放的是該容器的 size() ,而不是最大元素
set<int>::iterator themin= mins.begin();
set<int>::iterator themax= maxs.begin();
cout << *themin << " " << *themax << endl;
system("pause");
}