拼多多2021提前批笔试题

参考链接:
https://www.nowcoder.com/discuss/465198?type=post&order=time&pos=&page=1&channel=666&source_id=search_post
https://august-us.blog.csdn.net/article/details/107751194
第一题:飞行棋
输入:
两行数字,其中第一行是距离终点的步数和最后还有几次掷色子机会(N);
第二行是n步棋的每一步是多少数值。(数值是掷色子决定的,所以在1-6之间)。
输出:
一行数字,第一个数字为最终棋子到终点的距离,第二个数字为回退的次数。
如果在掷N次色子之前已经到达终点,则输出“paradox"

例:
输入:10 2
3 6
输出:
1 0

import sys
for i in range(0,1):
	line=sys.stdin.readline().strip()
	values=list(map(int,line.split()))
for i in range(1):
	line=sys.stdin.readline().strip()
	values1=list(map(int,line.split()))	
k=values[0]
n=values[1]
res = 0
for id,i in enumerate(values1):
    if i==k and id!=n-1:
        print('paradox')
        exit(0)
    elif i<=k:
        k-=i
    else:
        k=i-k
        res +=1

print(k, res)

第二题:掷色子
备注:筛子的6个面排列顺序是(上下左右前后)
输入:
第一行为n代表多少枚筛子,第二行为第一个筛子的6个面的数值,第三行为第二个筛子的6个面,一直到第n+1行为第n个筛子的。
输出:
两行,第一行为多少种不同类别的筛子,第二行为每一种类别对应的个数,按大到小排列。

例:
输入:
2
1 2 3 4 5 6
1 2 6 5 3 4
输出
1
2
思路:无论筛子的1在什么位置,通过向左转向右转向前转向后转和上下翻(分为顺时针逆时针)转都可以将筛子改变为1面向上的情况,将筛子置为1向上的情况之后,继续考虑筛子原地自转的三种情形,从而纠正筛子的位置,将所有筛子纠正完成后,判断各类筛子的个数。

from collections import defaultdict

if __name__ == '__main__':
    m = int(input())
    counter = defaultdict(int)
    a, b, c, d, e, f = 0, 1, 2, 3, 4, 5
    for _ in range(m):
        nums = list(map(int, input().split()))
        for idx, val in enumerate(nums):
        #先把1转到最上,如果相同类型的话,2一定为最下
            if val == 1:
                if idx == a:
                    break
                elif idx == b:
                    nums[a], nums[b] = nums[b], nums[a]
                    nums[e], nums[f] = nums[f], nums[e]
                elif idx == c:
                    nums[a], nums[d], nums[b], nums[c] = nums[c], nums[a], nums[d], nums[b]
                elif idx == d:
                    nums[a], nums[c], nums[b], nums[d] = nums[d], nums[a], nums[c], nums[b]
                elif idx == e:
                    nums[a], nums[f], nums[b], nums[e] = nums[e], nums[a], nums[f], nums[b]
                elif idx == f:
                    nums[a], nums[e], nums[b], nums[f] = nums[f], nums[a], nums[e], nums[b]
                break
        num2f = nums[a] + 1 #此时num2f为2
        if num2f == nums[b]:#判断2是否为最下
            num2f += 1
        #通过判断3所在位置,纠正筛子的自转。将筛子六个面数值纠正为[1,2,3,4,5,6]
        for idx, val in enumerate(nums):
            if val == num2f:
                if idx == c:
                    break
                elif idx==d:
                    nums[c],nums[d]=nums[d],nums[c]
                    nums[e],nums[f]=nums[f],nums[e]                
                elif idx==e:
                    nums[c],nums[d]=nums[e],nums[f]
                    nums[e],nums[f]=nums[c],nums[d]
                elif idx ==f:
                    nums[c], nums[d], nums[e], nums[f] = nums[f], nums[e], nums[c], nums[d]
        counter[tuple(nums)] += 1
    ret = [v for k, v in counter.items()]
    ret.sort(reverse=True)
    print(len(ret))
    for v in ret:
        print(v,end= ' ')

第三题:多多吃饭
备注:多多不吃早饭,吃午饭晚饭(可以只吃午饭或晚饭或者都不吃饿死)
输入:第一行三个数表示中餐总数N、晚餐总数M、多多满足的最小美味值T。
第二行到第N+1行为中餐的热量和美味值
第N+2行到N+M+1行代表晚餐的热量和美味值

输出:
一个整数,表示在T满足的条件下,最少的摄入热量,如果任何组合都无法达到T,输出-1
例:
输入:
2 2 5
1 2
1 3
2 2
3 3
输出:
3
(选中饭第二种和晚饭第一种)

from collections import defaultdict

if __name__ == '__main__':
    n, m, t = map(int, input().split())

    lunch = []
    dinner = []
    for _ in range(n):
        # 热量 美味值
        lunch.append(list(map(int, input().split())))
    for _ in range(m):
        dinner.append(list(map(int, input().split())))
    if t == 0:
        print(0)
    else:
        lunch.sort(key=lambda x: x[1])
        dinner.sort(key=lambda x: x[1])
        ll = []
        dd = []
        for idx, val in enumerate(lunch):
            while ll and val[0] <= ll[-1][0]:
                ll.pop()
            if ll and val[1] == ll[-1][1]:
                continue
            ll.append(val)

        for idx, val in enumerate(dinner):
            while dd and val[0] <= dd[-1][0]:
                dd.pop()
            if dd and val[1] == dd[-1][1]:
                continue
            dd.append(val)

        ret = float('inf')
        for val in ll:
            if val[1] >= t:
                ret = min(ret, val[0])
                break
        for val in dd:
            if val[1] >= t:
                ret = min(ret, val[0])
        for idx, val in enumerate(ll):
            if val[1] >= t:
                break
            for idx, d in enumerate(dd):
                if d[1] + val[1] >= t:
                    ret = min(ret, d[0] + val[0])
                    break
        if ret == float('inf'):
            print(-1)
        else:
            print(ret)

第四题:多多种菜
多多有个66大小的地,有的地方有建筑,有的地方没有,他想在每块没有建筑的土地上播撒爱的种子,种子一共六种(分别为1 2 3 4 5 6 名字忘了凑合看),满足每块地上的农作物和前后左右相邻的都不一样。
输入:
一共六行,#表示无建筑,表示有建筑。
输出:
最终方案的结果
实例:
"#
*****
中间四行都有建筑
*****#
输出:
36

请各位大佬不吝赐教

你可能感兴趣的:(面经,笔试,算法)