【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.csdn.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语言,自己做的反而都作废,也难怪笔试挂了那么多。虽然大部分笔试都完了,才知道这事,但也坦然了。

过去的事情不要在挂念,徒增烦恼,勇敢的走下去吧。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值