360笔试2020真题 序列重组

题目描述:
在一个古老的国度,这个国家的人并不懂得进位,但是对取模情有独钟,因此诞生了一个经典的问题,给出两个在m进制下含有n位的数字,你可以分别将这两个数各位上的数字重新排列,然后将两个数按位对应相加并分别对m取模,这样显然可以得到一个新的m进制下的n位数(可能存在前导0),但是这个结果是不唯一的,问题来了,按照这样的操作,能够得到的最大的m进制下的数字是多少呢。
输入:
输入第一行包含两个正整数n,m分别表示数字含有n位,和在m进制下。
输入第二行和第三行分别包含n个整数,中间用空格隔开,每个整数都在0到m-1之间,每行第i个数表示的是当前数第i位上的数字。
输出:
输出包含n个数字,中间用空格隔开,表示得到的是最大的数字,从高位到低位输出,如6在2进制下输出3位的结果是1 1 0.
思路:以样例输入为例,n=5,m=5,a = [4, 4, 1, 1, 1],b = [4, 3, 0, 1, 2]
首先构造m-1,也就是4,a中的1,4和b中的3,0可以构成4,去掉这两位,a = [4, 1, 1],b = [4, 1, 2]
然后再构造m-2,知道a和b为空。

import sys
n, m = [int(x) for x in sys.stdin.readline().strip().split()]
array = []
a = [int(x) for x in sys.stdin.readline().strip().split()]
b = [int(x) for x in sys.stdin.readline().strip().split()]
ans = ''
k = 1
while a:  
    res = set([(m-k-i)%m for i in a])    
    print('a:',a,'b:',b, 'minus:',res,'sum:',m-k)    
    for u in res:        
        v = (m-k-u)%m        
        if u in b:            
            t = min(b.count(u),a.count(v))
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值