題目大意:有n個螞蟻在一個桿長為d的桿上,他們的位置(以螞蟻和桿的最左端的距離為標准)依次是接下來的n個數。
任意的螞蟻爬行的時候,若兩個螞蟻相遇,那么他們按照各自的反方向爬行(螞蟻轉彎的時間忽略不計),若螞蟻爬到了最左(右)端,那么該螞蟻掉下來。
螞蟻最初選擇行走的方向不定,求所有螞蟻都掉下來的可能的最早時間和最晚時間。
分析:
該問題看起來復雜,其實不然,如果光想着兩只螞蟻相遇之后的情景,那就是很復雜了,我們可以換位思考,我們要求螞蟻都掉下來的時間,因為每個螞蟻對我們來說都是一樣的,所以就算兩個螞蟻相遇了,他們的本質對我們來說還是不變(相遇前一個向左爬行,一個向右爬行;相遇后還是一個向左爬行一個向右爬行)。
看出來這個問題,這題就沒有復雜可言了,顯然答案已經揭曉:
AnsMin= MAX{AnsMin, Min(a,b) } (a,b代表每只螞蟻距離最左端和最右端的距離)
AnsMax=MAX{AnsMax,Max(a,b) }
好了,貼上代碼吧:
1 #include<stdio.h> 2 #define MAX(a,b) a>b ? a : b 3 int main() 4 { 5 int N,d,n; 6 scanf("%d",&N); 7 for(int i=1;i<=N;i++){ 8 scanf("%d%d",&d,&n); 9 int a,b,AnsMin=0,AnsMax=0; 10 while(n--){ 11 scanf("%d",&a); 12 b=d-a; 13 if(a>b) a=b,b=d-a; 14 AnsMin=MAX(AnsMin,a); 15 AnsMax=MAX(AnsMax,b); 16 } 17 printf("%d %d\n",AnsMin,AnsMax); 18 } 19 return 0; 20 }
