天天看點

51NOD 1266 螞蟻

1266 螞蟻

題目來源: Poj

基準時間限制:1 秒 空間限制:131072 KB 分值: 20 難度:2級算法題

n隻螞蟻以每秒1cm的速度在長為Lcm的竿子上爬行。當螞蟻爬到竿子的端點時就會掉落。由于竿子太細,兩隻螞蟻相遇時,它們不能交錯通過,隻能各自反向爬回去。對于每隻螞蟻,我們知道它距離竿子左端的距離xi,但不知道它目前的朝向。請計算各種情況當中,所有螞蟻落下竿子所需的最短時間和最長時間。

例如:竿子長10cm,3隻螞蟻位置為2 6 7,最短需要4秒(左、右、右),最長需要8秒(右、右、右)。

Input

第1行:2個整數N和L,N為螞蟻的數量,L為杆子的長度(1 <= L <= 10^9, 1 <= N <= 50000)
第2 - N + 1行:每行一個整數A[i],表示螞蟻的位置(0 < A[i] < L)      

Output

輸出2個數,中間用空格分隔,分别表示最短時間和最長時間。      

Input示例

3 10
2
6
7      

Output示例

   4 8

題解:碰撞後反向爬其實相當于擦肩而過,是以最短時間就是最靠近中間的那個點到兩端點距離的較小值,最長時間就是最靠近兩端點的點到另一邊端點的距離。

AC代碼:

1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int n,max1,min1,l;
 5 int main()
 6 {
 7     cin>>n>>l;
 8     min1 = 1e9+7;
 9     max1 = 0;
10     for(int i =1;i<=n;i++)
11     {
12         int x;
13         cin>>x;
14         min1 = min(min1,min(abs(l/2-x),abs(x-l/2)));
15         max1 = max(max1,max(l-x,x));
16     }
17     cout<<l/2-min1<<" "<<max1<<endl;
18     return 0;
19 }