有一个任务,我附上条件截图:
我写了两个解决方案,似乎都可以正常工作,但是在数量较多时,程序需要很长时间才能执行,并且时间测试失败。
第一个选项:
def find_a_x(X):
for i in range(X, 0, -1):
if bin(i).count('1') == 3:
return i
return -1
T = int(input())
for _ in range(T):
X = int(input())
result = find_a_x(X)
print(result)
带缓存的选项(不确定缓存是否正确实现):
def find_a_x(X, cache):
if X in cache:
return cache[X]
for i in range(X, 0, -1):
binary_str = bin(i)[2:]
if binary_str.count('1') == 3:
cache[X] = i
return i
cache[X] = -1
return -1
T = int(input())
for _ in range(T):
X = int(input())
result = find_a_x(X, {})
print(result)
文本条件:
上课时,一名学生接管了黑板,开始写下一些奇怪的数字,结果发现这些数字根本不是随机的,爱丽丝注意到黑板上写的 2N 个数字是分成两对的,这样对于每个数字 X 都有一个数字 a (X),使得 a(X) 等于不超过 X 的最大自然数,并且在其二进制表示法中恰好包含三个。如果不存在这样的数字,则 a(X) = -1。
输入数据格式。
第一行包含一个数字 T - 测试用例的数量,接下来的第 i 个 T 行包含由单个自然数给出的第 i 个测试。
输入数据示例:
4
1
8
1023
7
回答:
-1
7
896
7

如果二进制表示的数字至少包含三个,那么我们只留下三个最高的:
1010111010
1010100000
如果二进制表示的数字少于三个单位,则将其减 1:
100亿
0111111111
如果减少结果的数字小于 7(即 110、101、100、11、10、1 或 0),则我们输出 -1,否则我们将结果数字再次传递给算法。
我立即决定,只留下三个领导单位:
有人向我建议了一个更优雅的解决方案,但稍作改动: