这是牛客网中的一道题:
现在有n个0到9的数字,需要用它们组成两个数,这两个数都不能有前导0,使得这两个数加起来最小。
输入数据格式如下:
4 #第一行表示有几个数
1 0 2 3 #第二行给出具体的数
输出格式:
33
注意:
1、当第二行所给数字少于第一行时,缺的数字按最后一个数字补齐,例如
4
5 2 3 #实际是5 2 3 3
2、组成的两个数的最高位不能是0,即样例中不能出现01+23的情况
3、n要求不小于2,且非零数不少于2,第二行的数字均为个位数
利用python求解代码如下
def adaptlist(B):
# 将一个列表中的零元素和非零元素分开
# c中存储的是零元素,d中存储的是非零元素
c = list()
d = list()
for b in B:
if b == 0:
c.append(b)
else:
d.append(b)
return (c, d)
# 数据的输入及相关处理
def getnumber(d):
# 将选取的两个数分别存入num1,num2中
num1 = list()
num2 = list()
for i in range(0, len(d)):
if i % 2 == 0:
num1.append(d[i])
else:
num2.append(d[i])
return (num1, num2)
def list2number(num):
# 将list中的元素变成一个数
a = 0
for i in range(0, len(num)):
a = a + num[i] * 10**(len(num) - i - 1)
return a
# 标准输入
import sys
# 这里考虑一行数据里有多个数据,所以我们用二维list来进行存储
num = [[0 for col in range(0)] for row in range(2)]
s = sys.stdin.readline().strip() # 得到第一行的数据
for i in range(2):
temp = s.split() # 删掉字符串的首尾空格
num[i] = list(range(len(temp)))
for kk in range(len(temp)):
num[i][kk] = int(temp[kk])
s = sys.stdin.readline().strip()
# 数据的处理
# 将输入的一些数据组成两个数,使得这两个数加起来最小
# 显然位数越小和最小,比如8个数组成两个四位数和最小,7个数组成4位数加3位数和最小
# 将除零以外的最小的两个数做为这两个数的首位,其余的数按从小到大的数排列
# 首先将输入的数据在list中从小到大进行排列,并保证第一个数不是0
# 在这里调用sort函数(也可以用sorted函数,这里就不再赘述)
# b = list(map(int, b))
b = num[1] # 得到输入的数
# 判断输入的数字是否需要补齐
k = b[-1]
m = num[0][0] - len(b)
if m != 0:
for i in range(0, m):
b.append(k)
c, d = adaptlist(b)
# 确定组成的两个数位数分别是多少
d.sort() # 将所有非零元素按从小到大的顺序排列
if c != []:
for x in c:
d.insert(2, x)
num1, num2 = getnumber(d)
print("num1=", num1, "num2=", num2)
a = list2number(num1)
b = list2number(num2)
print(a + b)