作為一個本科碩士都是在一個普通的省屬211大學讀書的我雖然有着兩年的工作經驗但是對計算機這東西仍然是不太在行,在2016年讀到研三的時候准備報考同一城市的985高校東北大學,聯系了一通老師最后只有得到的答案基本都是沒有名額,東北大學學術排名前幾的老師回復我的都是委婉中帶着鼓勵及激勵這一點確實感覺真的是很有學者風范的,經過近一個月的努力總算聯系到了一個實驗室有名額,就是楊老師的實驗室。能夠讀985高校的博士對於我來講還是很理想的,得到信息后開心之余遇到了一個問題,那就是實驗室要求參加面試也就是說只有面試通過了才能報考,按照老師的要求我如約到達東北大學渾南校區參加實驗室的面試,由於老師比較忙,所以到達后是由實驗室的同學負責面試的,出了兩道編程題,第一道題比較簡單現今也已經記不住了,第二道題沒有答出來現把該題的大致描述給出,具體的測試數據是記不住了這里的數據是自己模擬給定的。(由於該題的失敗導致我沒有拿到該實驗室的報名資格,痛惜啊,雖然現今已經被同省的另一個985高校擬錄取手里也握着一摞子技術公司的offer還是感慨這次面試的失敗)
題目大致意思如下:
一輛公交車從始發站出發,乘客全部在始發站上車,路上一共有N個公交車車站,車上的乘客在N個車站分別下車並最終全部下完,N 個站點之間等距。
現給定數m , 1<=m<=N, 即公交車一路上不會在每一個車站都停只會在N個車站中選擇 m個車站 停車,沒有在原定車站下車的乘客將會步行走回原定車站,問所有乘客下車后走回原定車站所花路程之和最短為多少?(用站數表示)
輸入:
第一行為 每站都停的情況下各車站乘客下車的人數, 第二行為公交車選擇停車的站數。
輸出:
最短路程
測試數據:
51 39 45 21 17 32 34 9 37 26
5
42 21 20 19 43
4
這道題我是百思不得其解,總感覺這東西智能窮舉來弄要是用動態規划的法實在找不到什么遞推關系,面試的時候實驗室博士生在討論問題而面試我的東大研究生在旁邊坐着,看着我實在是弄不出問我有沒有學過算法知不知道有動態規划算法,我只能在那暗自叫苦那滋味真是難以描述。最后,我也沒有想到如何用動態規划算法來弄,這里給出我寫的窮舉算法,希望網上有識之士給出幫助。
#!/usr/bin/env python #encoding:UTF-8 import sys import itertools data=[int(k) for k in sys.stdin.readline().split()] m=int(sys.stdin.readline()) N=len(data) scoreList=list(itertools.combinations(range(N), m)) def fun(scoreTuple): distList=[] for i in xrange(N): temp=[] for j in scoreTuple: temp.append(abs(i-j)) distList.append(min(temp)) return distList score=[] for k in scoreList: score.append(fun(k)) score2=[] for k in score: s=0 for i in xrange(N): s+=k[i]*data[i] score2.append(s) print min(score2) #print scoreList[score2.index(min(score2))]
后記:
這題目中其實還有一個限定條件就是 N<=10 , 我想在這個條件之下窮舉法更是可行的了,經驗證以上代碼確實可在限定的內存和運行時間內計算出正確答案。
推薦鏈接 考研相關:
http://bbs.kaoyan.com/t4740568p1
