拼多多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

from collections import defaultdict

if __name__ == '__main__':
    m = int(input())
    counter = defaultdict(int)
    u, d, l, r, f, b = 0, 1, 2, 3, 4, 5
    for _ in range(m):
        nums = list(map(int, input().split()))
        for idx, val in enumerate(nums):
            if val == 1:
                if idx == u:
                    break
                elif idx == d:
                    nums[u], nums[d] = nums[d], nums[u]
                    nums[f], nums[b] = nums[b], nums[f]
                elif idx == l:
                    nums[u], nums[r], nums[d], nums[l] = nums[l], nums[u], nums[r], nums[d]
                elif idx == r:
                    nums[u], nums[l], nums[d], nums[r] = nums[r], nums[u], nums[l], nums[d]
                elif idx == f:
                    nums[u], nums[b], nums[d], nums[f] = nums[f], nums[u], nums[b], nums[d]
                elif idx == b:
                    nums[u], nums[f], nums[d], nums[b] = nums[b], nums[u], nums[f], nums[d]
                break
        num2f = nums[u] + 1
        if num2f == nums[d]:
            num2f += 1
        for idx, val in enumerate(nums):
            if val == num2f:
                if idx == f:
                    break
                elif idx == b:
                    nums[f], nums[b] = nums[b], nums[f]
                    nums[l], nums[r] = nums[r], nums[l]
                elif idx == l:
                    nums[f], nums[r], nums[b], nums[l] = nums[l], nums[f], nums[r], nums[b]
                elif idx == r:
                    nums[f], nums[l], nums[b], nums[r] = nums[r], nums[f], nums[l], nums[b]
        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

请各位大佬不吝赐教

猜你喜欢

转载自blog.csdn.net/weixin_43518584/article/details/107751536