问题描述
注意:问题陈述的主要部分“ReveRSSort”和 除了最后一段之外,“逆向工程”是相同的。 否则问题可以独立解决。
反向排序是一种对不同整数列表进行排序的算法 递增顺序。该算法基于“反向”操作。 此操作的每次应用都会颠倒某些顺序 列表的连续部分。
经过 i−1 次迭代后,列表的位置 1,2,…,i−1 包含 L 的 i−1 个最小元素,按递增顺序排列。在第 i 个 迭代,该过程反转从第 i 个开始的子列表 position 到第 i 个最小元素的当前位置。那 使第 i 个最小元素在第 i 个位置结束。
例如,对于具有 4 个元素的列表,该算法将执行 3 迭代。以下是处理 L=[4,1,3] 的方式:
i=1,j=3⟶L=[1,4,3] i=2,j=2⟶L=[1,3] i=3,j=4⟶L =[1,3,4] 在我们的架构上执行算法最昂贵的部分是 反向操作。因此,我们对每个成本的衡量 迭代只是传递给 Reverse 的子列表的长度,即 是 j−i+1 的值。整个算法的代价是 每次迭代的成本。
在上面的示例中,迭代成本为 3、1 和 2,依次为: 一共6个。
给定初始列表,计算对其执行 Reversort 的成本。
Input 输入的第一行给出了测试用例的数量,T.T 测试用例如下。每个测试用例由 2 行组成。第一行 包含一个整数 N,表示其中的元素数 输入列表。第二行包含 N 个不同的整数 L1,L2, ...,LN,依次表示输入列表L的元素。
输出 对于每个测试用例,输出一行包含 Case #x: y, 其中 x 是测试用例编号(从 1 开始),y 是总数 对作为输入给出的列表执行逆向排序的成本。
限制时间限制:10 秒。内存限制:1 GB。测试集 1(可见 判断)1≤T≤100。 2≤N≤100。 1≤Li≤N,对于所有的i。 Li≠Lj,因为所有的 i≠j。 样本样本输入 3 4 4 2 1 3 2 1 2 7 7 6 5 4 3 2 1 样本输出 案例#1:6 案例#2:1 案例#3:12 示例案例#1 在 以上声明。
在示例案例 #2 中,有一次迭代,其中 Reverse 是 应用于大小为 1 的子列表。因此,总成本为 1。
在示例案例 #3 中,第一次迭代反转完整列表,对于 成本为 7. 之后,列表已经排序,但有 5 更多的迭代,每次贡献的成本为 1。
def Reversort(L):
sort = 0
for i in range(len(L)-1):
small = L[i]
x = L[i]
y = L[i]
for j in range(i,len(L)):
if L[j] < small :
small = L[j]
sort = sort + (L.index(small) - L.index(y) + 1)
L[L.index(small)] = x
L[L.index(y)] = small
print(L) #For debugging purpose
return sort
T = int(input())
for i in range(T):
N = int(input())
L = list(map(int,input().rstrip().split()))
s = Reversort(L)
print(f"Case #{i+1}: {s}")
解决方法
您的代码在测试用例 7 6 5 4 3 2 1 中失败。代码给出的答案是 18,而答案应该是 12。
您忘记在 i 和 j 之间反转列表。
算法说
在第 i 次迭代期间,该过程将子列表从第 i 个位置反转到第 i 个最小元素的当前位置。