【VMware】 2019校招在线考试 (python)(数量有限的最少硬币问题、还能拖多久、最大整数)
1.硬币个数有限,要求用最少的硬币找钱。
这是经典动态规划考题“最少硬币问题”的变形,当硬币个数有限的时候,拼凑硬币的最少个数。
参考 http://www.voidcn.com/article/p-fnfrzdfl-uz.html
忘记要sort一下了,结果只通过了9%。
硬币个数有限,要求用最少的硬币找钱。
假设各种硬币面值t[i]
(顺排),个数c[i]
,a[i][j]
为用t[0]..t[i]
面值的硬币找钱j的最少硬币个数。
则a[i][j] = min{k + a[i - 1][j – k * t[i]]}, 0 <= k <= c[i]
相当于遍历第 i 种硬币的可能性。
t=[1,2,5] #硬币面值
c=[2,3,2] #硬币个数
def work(s):
n=s+1
a=[[0 for col in range(2)] for row in range(n)]
m=[[0 for col in range(n)] for row in range(len(t))]
flag = 0
for j in range(n):
if j/t[0]>c[0]:
tmp = 9999
else:
tmp = j/t[0]
if j%t[0]==0:
a[j][0] = tmp
else:
a[j][0] = 9999
m[0][j] = a[j][0]
for i in range(len(t)):
nnext = (flag+1)%2
for j in range(1,n):
a[j][nnext] = 9999
for k in range(c[i]):
if j-k*t[i]<0:
break
if a[j][nnext] > a[j - k * t[i]][flag]:
a[j][nnext] = k + a[j - k * t[i]][flag]
m[i][j] = k
flag = nnext
if a[s][flag]!=9999:
tt = s
for i in range(len(t),-1,-1):
if tt>=0:
print(m[i][tt]+'*'+t[i])
tt -=m[i][tt]*t[i]
return a[s][flag]
return -1
print(work(18))
2.日期问题
这题浩哥帮忙做的,感谢感谢。
class Date:
def __init__(self):
self.y = None #年
self.m = None #月
self.d = None #日
def isLeap(y):
return y % 4 == 0 and y % 100 != 0 or y % 400 == 0
def daysOfMonth(y,m):
day = [31,28,31,30,31,30,31,31,30,31,30,31]
if m != 2:
return day[m - 1]
else:
return 28 + isLeap(y)
def daysOfDate(d):
days = d.d
for y in range(1,d.y): #只取到上一年
days += 365 + isLeap(y)
for m in range(1,d.m): #取不到当月,因为当月不会取满,只取到上一个月。
days += daysOfMonth(d.y, m)
return days
d1,d2 = Date(),Date()
n = int(input())
for i in range(n):
a,b,c,d,e = [int(kk) for kk in input().split()]
d1.y = a
d2.y = a
d1.m = b
d1.d = c
d2.m = d
d2.d = e
if d<b or (d == b and e<c):
d2.y = a + 1
days1 = daysOfDate(d1)
days2 = daysOfDate(d2)
print(days2 - days1)
3.最大整数
有n个正整数,请将它们拼接成一排,组成一个最大的多位整数。例如:n=3时,3个整数13,312,343拼接成的最大整数为:34331213.
输入:第一行为正整数个数n(n<=10000),第二行n个以空格相隔的正整数(integer类型)
输出:输出一行表示答案
样例输入:
3
13 312 343
样例输出:
34331213
Hint:
样例中的6种不同的拼接方案中,只有34331213是最大的,因此我们只需要输出34331213.
参考 https://blog.****.net/u010886535/article/details/80962105 (这个只过了40%)
重点在于怎么排序,一开始以为是把所有排列组合都列出来,后来发现sort里的cmp规则,可以先想做简单的,两个数字的比较,所以比较字符b+a和字符a+b哪个大,然后以此规则,遍历整个list。
from functools import cmp_to_key
n = int(input())
nums = [k for k in input().split()] #因为后面用到的字符串,所以这里保留的str格式
#nums = ['312','343', '13']
#nums = ['7','13','4','246']
nums.sort(key=cmp_to_key(lambda a, b: int(b+a) - int(a+b))) #字符串a+b>b+a那么认为a>b,因为从大到小排序,所以用(b+a)-(a+b)
print (int(''.join(nums))) #拼成一串数字
VMware是在9.30上午8-10点笔试的,很早没这么早起了,笔试很懵,做得也不太好,很可惜。幸而实验室同学浩哥帮忙做了一题,真的很感谢。
之前一直没留意,笔试只能保存一种语言,有时候自己用python写了前两题,最后一题是同学用java或c++助攻的,结果原来只保存了java语言,自己做的反而都作废,也难怪笔试挂了那么多。虽然大部分笔试都完了,才知道这事,但也坦然了。
过去的事情不要在挂念,徒增烦恼,勇敢的走下去吧。