作为一个本科硕士都是在一个普通的省属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