【发布时间】:2021-10-29 16:02:18
【问题描述】:
我正在尝试解决一个涉及反转列表拼接的问题,但我遇到了测试用例的时间限制问题,即 4 秒。问题:
Farmer John 的 N 头奶牛 (1≤N≤100) 排成一列。左边第 i 头奶牛有标签 i,每个 1≤i≤N。 Farmer John 为奶牛制定了一项新的晨练程序。他告诉他们准确地重复以下两步过程 K (1≤K≤1000000000) 次:
当前位置 A1…A2 的奶牛从左至右的顺序颠倒了它们的顺序 (1≤A1 评分:
测试用例 2-3 满足 K≤100。
测试用例 4-13 不满足其他约束。 输入格式(文件 swap.in):
输入的第一行包含 N 和 K。第二行包含 A1 和 A2,第三行包含 B1 和 B2。 输出格式(文件 swap.out):
在输出的第 i 行,在练习程序结束时从左侧打印第 i 头奶牛的标签。 样本输入: 样本输出: 最初,奶牛的顺序是从左到右 [1,2,3,4,5,6,7]。在该过程的第一步之后,顺序为 [1,5,4,3,2,6,7]。处理第二步后,顺序为[1,5,7,6,2,3,4]。第二次重复这两个步骤会产生样本的输出。 理论上,您可以通过找到程序重复的点,然后模拟反向 我的程序运行时间超过 100 秒。这个输入特别耗时,因为它运行的迭代次数最多,而且 当前代码: 如果有人知道解决此问题的方法,请发布答案。如果有任何不清楚的地方,请发表评论。7 2
2 5
3 7
1
2
4
3
5
7
6
k % frequency 次来解决此问题,其中frequency 是模拟唯一的次数。
但我的问题是当输入是:100 1000000000
1 94
2 98
frequency 非常高。fin = open("swap.in", 'r')
line = fin.readline().strip().split()
n = int(line[0])
k = int(line[1])
nums = [[int(x)-1 for x in fin.readline().strip().split()]for i in range(2)]
fin.close()
repeated = []
cows = [i for i in range(1, n+1)]
repeat = False
while not repeat:
for i in nums:
cows[i[0]:i[1]+1] = reversed(cows[i[0]:i[1]+1])
if cows[i[0]:i[1]+1] in repeated :
frequency = len(repeated)-1
repeat = True
repeated.append(cows[i[0]:i[1]+1])
cows = [i for i in range(1, n+1)]
for _ in range(k%frequency):
for i in nums:
cows[i[0]:i[1]+1] = reversed(cows[i[0]:i[1]+1])
fout = open("swap.out", 'w')
for i in cows:
fout.write(str(i) + "\n")
fout.close()
【问题讨论】:
-
我重新阅读了代码,看看您是如何尝试实现循环检测的。您是否期望
for i in nums循环在repeat设置为True时立即退出,因为 outerwhile not repeat:循环?循环不是那样工作的。while not repeat:条件只会在 that 循环的每次迭代中检查一次,这意味着内部循环的完整运行。 -
如果你正在做竞赛题并试图仔细考虑算法,我认为你不需要被告知像
break这样的基础知识。所以我认为这只是竞争压力造成的一个简单的疏忽。 -
@KarlKnechtel 不,我故意没有休息。如果你确实休息了,把频率=
len(repeated)-1改成frequency = len(repeated),当你用输入案例100 31279131 1 100 2 99尝试时它不起作用我目前也没有参加比赛,这只是一个练习问题. -
“他告诉他们重复以下两步过程恰好 K (1≤K≤109) 次”。那么为什么在那个测试用例中 K = 1000000000?
-
@blhsing 抱歉,这应该是指数。 10日到9日。
标签: python algorithm optimization simulation reverse