引言
對於演算法題,特別是藍橋杯的演算法題,coding能力固然是一方面,但是思維方式和思維能力更重要。題面藍橋組委推薦的cc150思維是解題的實用思維。
問題描述
長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。
每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺/秒。
當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。
這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。
請你計算,當所有螞蟻都爬離桿子時,有多少只螞蟻患上了感冒。
輸入格式
第一行輸入乙個整數n (1 < n < 50), 表示螞蟻的總數。
接著的一行是n個用空格分開的整數 xi (-100 < xi < 100), xi的絕對值,表示螞蟻離開桿子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,資料中不會出現0值,也不會出現兩隻螞蟻占用同一位置。其中,第乙個資料代表的螞蟻感冒了。
輸出格式
要求輸出1個整數,表示最後感冒螞蟻的數目。
樣例輸入
35 -2 8
樣例輸出
1樣例輸入
5-10 8 -20 12 25
樣例輸出3思路
第一印象就是暴力模擬,用乙個陣列或者結構體陣列模擬螞蟻個體,每乙個時鐘改變一次狀態,相遇就取反符號。
->這樣做就陷入了出題人的圈套了,這道題本質上是一道智力題,需要仔細觀察,大膽猜測,小心求證。模擬的話,一方面**不好寫,另一方面時間複雜度會非常非常大。不可取。
這道題在《挑戰程式設計程式設計》中有提到過。最關鍵的一點是:把「兩螞蟻相遇後反向」這個條件理解為:「兩螞蟻相遇後不改變方向」。實質上,這個題目需要就算的是「(感冒)螞蟻的數目」,作為數目統計而言,各個螞蟻本質上是一樣的,相遇後方向改不改變都是「乙隻螞蟻向左乙隻螞蟻向右」。因此兩螞蟻相遇後反向和兩螞蟻相遇後不改變方向在用於數目統計時,效果是一樣的。
具體思路
對於乙隻初始狀態朝右的螞蟻,即陣列第乙個數為正數時。考慮它的右側有沒有方向相反的螞蟻。為什麼?因為如果右側沒有異向的螞蟻,那麼在「螞蟻每次移動一厘公尺」的條件下,第一只感冒螞蟻左側的螞蟻不會接觸到它,右側的只有同向的也不會接觸到它,因此數目為1。如果右側有異向的螞蟻,那麼這些螞蟻都會被感染,此外,這些異向的螞蟻還會繼續往前行走,與初始螞蟻左側的狀態朝右走的螞蟻相遇。因此,這種情況下,數目為右側異向螞蟻數目+左側同向螞蟻數目。
對於乙隻初始狀態朝左的螞蟻,數目統計就與上述相反。若左側沒有異向的螞蟻,數目為1。若有,則數目為左側異向螞蟻數目+右側同向螞蟻數目。 **
**沒儲存…不想敲了(:逃
藍橋杯2023年c c B組(地宮尋寶)
x 國王有乙個地宮寶庫。是 n x m 個格仔的矩陣。每個格仔放一件寶貝。每個寶貝貼著價值標籤。地宮的入口在左上角,出口在右下角。小明被帶到地宮的入口,國王要求他只能向右或向下行走。走過某個格仔時,如果那個格仔中的寶貝價值比小明手中任意寶貝價值都大,小明就可以拿起它 當然,也可以不拿 當小明走到出口...
2013藍橋杯省賽A組C C B題
小明正看著 203879 這個數字發呆。原來,203879 203879 41566646641 這有什麼神奇呢?仔細觀察,203879 是個6位數,並且它的每個數字上的數字都是不同的,並且它平方後的所有數字上都不出現組成它自身的數字。具有這樣特點的6位數還有乙個,請你找出它!再歸納一下篩選要求 1...
2023年第五屆藍橋杯C C B組決賽真題題解
小明和他的表弟一起去看電影,有人問他們的年齡。小明說 今年是我們的幸運年啊。我出生年份的四位數字加起來剛好是我的年齡。表弟的也是如此。已知今年是2014年,並且,小明說的年齡指的是周歲。請推斷並填寫出小明的出生年份。這是乙個4位整數,請通過瀏覽器提交答案,不要填寫任何多餘的內容 比如,他表弟的出生年...