藍橋杯2014年C\C++A組-螞蟻感冒
長100釐米的細長直杆子上有n只螞蟻。它們的頭有的朝左,有的朝右。 每隻螞蟻都只能沿着杆子向前爬,速度是1釐米/秒。 當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。 這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。 請你計算,當所有螞蟻都爬離杆子時,有多少隻螞蟻患上了感冒。第一行輸入一個整數n (1 < n < 50), 表示螞蟻的總數。
接着的一行是n個用空格分開的整數 Xi (-100 < Xi < 100), Xi的絕對值,表示螞蟻離開杆子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,數據中不會出現0值,也不會出現兩隻螞蟻佔用同一位置。其中,第一個數據代表的螞蟻感冒了。要求輸出1個整數,表示最後感冒螞蟻的數目。
例如,輸入:3
5 -2 8
程序應輸出:1
5
-10 8 -20 12 25
程序應輸出:3
資源約定:峯值內存消耗 < 256M
CPU消耗 < 1000ms
考完後,問了學生,這個題答的都不。實際上,這個題目不需要模擬計算,只要分析分析,就可以得到結果。
試想螞蟻碰頭後,同時掉頭往相反的方向爬行和螞蟻碰頭後繼續穿行有什麼區別?關鍵理解這一點,就可以迅速得到結果。
其實,碰頭後相反方向爬行和穿行沒有區別!
也就是說,螞蟻可以絲毫不理會碰頭的事,直接往前爬就行了。
考慮到感冒傳染,假設感冒的螞蟻向右爬,那麼它右面向左爬的都被感染。注意它感染的第一隻向左爬的螞蟻,將繼續感染向它左邊右爬的螞蟻!
因此,最終感染的螞蟻的數量就是:以感冒的螞蟻爲中心,如果它向右爬(>0),則結果是它右面向左爬的螞蟻數量加上它左面向右爬的螞蟻數量再加上它自己!向左爬當然就是它左面向右爬的數量加上它右面向左爬的數量再加1了!
代碼不寫了。
由此,可以計算:第一隻爬出來的螞蟻用了多少時間?所有的螞蟻都爬出來用了多少時間?等等各種問題。