看到一篇算法文章,以爲着實有趣,但不知爲什麼我看到題後首先想到的是田忌賽馬。今天我也試着解釋下這題,當作是一個學習的過程。前端
題目:64 匹馬,8 個賽道,找出前 4 名最少比多少場?(馬的速度恆定不變)算法
直接開始學習
64 匹馬分 8 次在所有比完一次,而後咱們能夠把目標縮小到 32 匹馬。cdn
第一輪解析blog
一、八次比完後,咱們能夠將每一匹馬的速度按下表排好。it
二、每組比賽的後 4 名直接淘汰(小組中都沒法進前四,所有中必然沒法進前四);io
到如今爲止,已經進行了 8 次比賽base64
剩下的 8 組 32 匹馬選每組的第一名進行一次比賽,而後咱們能夠把目標縮小到 10 匹馬。class
第二輪解析lazyload
一、8組中第一名比完後(假設 A1 表示最快的,依次爲較慢者,H1最慢),此次比賽直接影響到它們這組是否能夠參加下一場的比賽,由於每組的第一都進不了前四的話那這組確定就沒有前四的馬啦。
二、因此這輪比賽的後四名直接全組淘汰,剩下 16 匹馬。
三、先別急着進行下一場的比賽,由於這裏面還能夠淘汰 6 匹馬。
D 組第一名 D1 都最多隻是第四名,因此 D二、D三、D4 就不須要再比了;C 組第一名 C1 最好成績是第三名,因此只有 C2 能夠衝一下第四名,C三、C4 淘汰;B 組第一名 B1 最好成績是第二名,因此 B二、B3 仍是有機會進前 4 的,B4 淘汰;A 組就運氣比較好,全組均可能進前 4 。
如今只有 10 匹馬的範圍啦。
即剩 A一、A二、A三、A四、B一、B二、B三、C一、C二、D1 十匹馬可能進前四。
到如今爲止,已經進行了 9 次比賽
A1 一定是第一名無需再比。B1 這個暫定第二的基本不須要再比,因此剩下的 A二、A三、A四、B二、B三、C一、C二、D1 這八匹馬再比一次。
第三輪解析(狀況有二)
一、這輪比賽若是 B2 或 C1 中兩者有其一進入前三,那比賽結束,前四名已經區分出來。(這點想不明白的話你想一想這個問題:跑步比賽中你跑過了第二名你是第幾名)
咱們知道 B1 在 BCD 三組中確定是最快的,因此 B2 或 C1 進入前三,B1 就必定再前四。
若結果爲: A2>B2>C1>C2>D1>A3>A4>B3
那麼前四就是 A一、A二、B一、B2(A二、B1 的名次不知)
二、若是比賽的前三戲劇性的是 A二、A三、A4,那麼咱們是不清楚 A4 快仍是 B1 快的,因此須要在比一場,就能找出前四。
狀況一:8 + 1 + 1 = 10, 共 10 次
狀況二:8 + 1 + 1 + 1 = 11,共 11 次
64 匹馬,8 個賽道,找出前 4 名最少須要比 10 場。
若是你想進【大前端交流羣】,關注公衆號點擊「交流加羣」添加機器人自動拉你入羣。關注我第一時間接收最新干貨。