CSDN话题挑战赛第2期
参赛话题:面试宝典
众人拾柴火焰高,我们一起携手共筑面试宝典,大家可以将各语言各技术各类面试真题或者你刷过的面试题汇聚于此,金九银十之际,让我们助应聘同学一臂之力~
面试题
面试题一:
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?
问题剖析:
理解题目所要说的意思即可。
问题解答:
# 采药
# 动态规划,01背包问题
# 所谓01背包问题:就是进行“采与不采”的优质选择
# dp[i] = max(采, 不采)
# 信息的输入
work_time, grass_number = map(int, input().split())
grass_time = []
grass_value = []
for i in range(grass_number):
need_time, value = map(int, input().split())
grass_time.append(need_time)
grass_value.append(value)
# 动态规划
row = [0] * (work_time + 1) # 创建初始表格,这个是不同的工作总时间
rol = [0] * (work_time + 1) # 这个是产生的对应的价值
for i in range(grass_number):
for j in range(work_time + 1):
if grass_time[i] <= j: # 这个草药可以采
# 不采:当前工作时间的最大值
# 采,当前采的这个的价值 + 减去当前时间中的最大值。
rol[j] = max(row[j], grass_value[i] + row[j - grass_time[i]]) # 0,1背包,在采和不采中找到最大值
row = rol[ : ] # 复制
print (rol[work_time]) # 输出最大值
面试题二:
某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文成绩从高到低排序,如果两个同学总分和语文成绩都相同,那么规定学号小的同学 排在前面,这样,每个学生的排序是唯一确定的。
任务:先根据输入的3门课的成绩计算总分,然后按上述规则排序,最后按排名顺序输出前五名名学生的学号和总分。注意,在前5名同学中,每个人的奖学金都不相同,因此,你必须严格按上述规则排序。例如,在某个正确答案中,如果前两行的输出数据(每行输出两个数:学号、总分) 是:
7 279
5 279
这两行数据的含义是:总分最高的两个同学的学号依次是7号、5号。这两名同学的总分都是 279 (总分等于输入的语文、数学、英语三科成绩之和) ,但学号为7的学生语文成绩更高一些。如果你的前两名的输出数据是:
5 279
7 279
则按输出错误处理,不能得分。
问题剖析:
这道题笔者就直接定义了数据类型grade,然后按题意定义了大小顺序并写出了排序。
然后排序就完了。
问题解答:
class grade:
def __init__(self,o,c,m,e):
self.o=o
self.c=c
self.t=c+m+e
def compare(g1,g2):
if g1.t!=g2.t:
return g1.t>g2.t
elif g1.c!=g2.c:
return g1.c>g2.c
else:
return g1.o<g2.o
def gsort(l):
if len(l)<=1:
return l
else:
l1,l2=[],[]
for i in range(1,len(l)):
if grade.compare(l[i],l[0]):
l1.append(l[i])
else:
l2.append(l[i])
return grade.gsort(l1)+[l[0]]+grade.gsort(l2)
n=int(input())
l=[grade(i,*map(int,input().split())) for i in range(1,n+1)]
l=grade.gsort(l)
for i in range(5):
print(l[i].o,l[i].t)