【发布时间】:2020-02-24 21:45:08
【问题描述】:
我正在尝试解决这个 Python 编码问题:
描述:安布罗休老师正在教他的二进制数 女儿 Ambrosinita,所以他决定制作一款游戏。
安布罗西奥会给安布罗西尼塔N个号码,安布罗西尼塔可以选择K个号码 在最初的 N 中。对于每个选择的数字,她都会获得一个分数 相当于使用二进制表示的 1 的数量 号码。
帮助 Ambrosinita 找出她可以赚取多少积分。
条目:
第一个输入行包含一个整数T,表示数字 测试用例。
每个测试用例都以包含整数 N(总数)的行开头 和 K(可以选择的数字)。
每个案例的最后输入行包含 N 个整数,表示 Ambrosinita 可以选择的数字。
输出:
为每个测试用例打印一行包含多少点 Ambrosinita 可以赚到。
1≤T≤10
1≤N≤10^3
0≤K≤N
0 ≤ 数字 ≤10^5
执行时间限制为 2 秒。我收到 TLE 错误,但输出与预期相同。因此,输入必须有一定的长度。
这是我的代码:
import itertools
test_cases = int(input())
def binary(num):
return format(num,'b')
def filter_string_1s(string):
aux = ''
for i in string:
if i == '1':
aux += i
return aux
for i in range(test_cases):
k = input().split()
k = int(k[1])
values = input().split()
values = [int(i) for i in values]
values = [filter_string_1s(str(binary(i))) for i in values]
bin_values = []
for combination in itertools.combinations(values,k):
aux = 0
for bin_number in combination:
for i in bin_number:
if i == '1':
aux += 1
bin_values.append(aux)
print(max(bin_values))
问题:我应该采取哪些步骤来优化它以便在执行时限内解决问题?
TLE = 超过时间限制
【问题讨论】:
-
请将问题编辑到您的问题中。我无法通过链接查看它。
-
欢迎堆栈溢出!请提供您要解决的问题的简要说明,而不是指向外部网站的链接
-
你知道为什么它需要超过 2 秒吗?你认为循环
itertools.combinations(values,k)会做多少次迭代? -
@KevinWang 我尝试在使用 itertools.combinations() 之前从列表中删除重复的元素,但它没有用(我仍然有 TLE)。
-
@flsantos0101 但是会有多少次迭代?
values的大小可以有多大?
标签: python python-3.x performance