1. 程式人生 > >《挑戰程序競賽》1.6.2 Ants poj1852

《挑戰程序競賽》1.6.2 Ants poj1852

通過 最短時間 程序競賽 要求 span str 速度 計算 ont

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

解法:(1)對於最短時間,所有螞蟻都朝向較近的端點走時時間最短,因為這種情況下不會發生兩只螞蟻相遇的情況,所以只要求出這種情況下最後一只到端點的螞蟻的時間即可,時間亦最短。

   (2)對於最長時間,如果不考慮螞蟻的實際體長等外在因素,兩只螞蟻相遇掉頭的情況可視為保持原樣交錯而過,即每只螞蟻要走當前位置到竿子端點的最大距離,所以只要求出這種情況下最

後一只到端點的螞蟻的時間即可,時間亦最長。

code:

 1 #include <iostream>
 2 #include <algorithm>
 3 using namespace std;
 4 
 5 #define maxn 100000
 6 int l;
 7 int n;
 8 void func(int a[]){
 9     int mint = 0;
10     int maxt = 0;
11 
12     for(int i=0; i<n; i++)
13     {
14         mint = max(mint, min(a[i], l-a[i]));
15 } 16 17 for(int j = 0; j< n; j++) 18 { 19 maxt = max(maxt, max(a[j], l-a[j])); 20 } 21 22 cout<<mint<<" "<<maxt<<endl; 23 } 24 25 int main() 26 { 27 int m; 28 int a[maxn]; 29 cin >> m; 30 while(m --) 31 { 32 cin>>l>>n;
33 for(int i=0; i<n; i++) 34 cin>>a[i]; 35 func(a); 36 } 37 return 0; 38 }

《挑戰程序競賽》1.6.2 Ants poj1852