滴滴前端笔试题 60min 积木价值

题目

小明正在进行积木的分销。他一共有N个积木,他要将它们分装到M个小包装内,每个小包装内至少有一个。如果一个小包装内含x个积木,那么这个小包装将会被定价为X2。小明想要控制一下价格,不希望价格太贵或者太便宜。他想要知道是否存在一种分装方案,使得分装后的M个小包装定价之和恰好为P。


 
 

如果有多种方案,输出字典序最小的那一个。对于两种不同方案{a1,a2,...,aM}与{b1,b2,...,bM},若对于1≤i≤t的i均有ai=bi,且at+1<bt+1,那么认为方案a的字典序小于方案b。

注意:当t=0时,没有合法的i存在,1≤i≤t只是限制i的范围。

例如,对于M=3,N=4的情况下,{1,1,2}的字典序小于{2,1,1} (对应t=0的情况) 、{1,2,1} (对应t=1的情况)。


代码

import itertools
def valid_partition(partition, p):
    sum_squared = sum([x**2 for x in partition])
    return sum_squared == p
def smallest_lexicographical(partitions):
    smallest_partition = partitions[0]
    for partition in partitions:
        for i in range(len(smallest_partition)):
            if partition[i] < smallest_partition[i]:
                smallest_partition = partition
                break
            elif partition[i] > smallest_partition[i]:
                break
    return smallest_partition
n, m, p = map(int, input().split())
min_num_per_pack = 1
max_num_per_pack = n
valid_partitions = []
for partition in itertools.combinations_with_replacement(range(min_num_per_pack, max_num_per_pack+1), m):
    if valid_partition(partition, p):
        valid_partitions.append(partition)
if len(valid_partitions) == 0:
    print(-1)
else:
    smallest_partition = smallest_lexicographical(valid_partitions)
    print(" ".join(str(x) for x in smallest_partition))

猜你喜欢

转载自blog.csdn.net/long_songs/article/details/129482751