首先题本身的逻辑不复杂,最直接的采取冒泡计数/模拟冒泡都可以解决。
但python的问题就出在输入格式里了:
第二行是 N 个不同的数表示初始的车厢顺序。 (注:实际上数据中并不都在同一行,有可能分行输入)
为什么python会出现问题但是c++不会?这里让我们引用chatgpt的一段解释:
输入流机制:C++ 使用 cin 流来读取输入,它可以连续读取多个值,直到输入流结束。这意味着,无论输入是分行还是在同一行,cin 都会自动处理并连续读取下一个值。例如,您可以使用 while (cin >> value) 来连续读取值,直到没有更多输入。
格式更宽松:在 C++ 中,当使用 cin 读取数据时,它会自动跳过空白字符(包括空格和换行符)。这使得处理分行或同行的输入变得更加直接,因为 cin 会持续读取直到遇到非空白字符。
类型安全和直接性:C++ 在类型安全和直接处理数据方面较为严格,这意味着如果您尝试读取与预期类型不匹配的数据,程序将会产生错误或异常行为。这种严格性有助于避免某些类型的输入错误。
例如,在 C++ 中,您可以使用以下代码来读取一系列整数,无论它们是在单行中还是分布在多个行中:
int n;
cin >> n;
vector<int> arr(n);
for(int i = 0; i < n; ++i) {
cin >> arr[i];
}
在这段代码中,cin 会自动处理空格和换行符,并连续读取 n 个整数到数组 arr 中。由于 C++ 的输入流机制,这段代码不需要担心输入是分行还是同行。
相比之下,Python 在处理输入时更加灵活,但也因此需要更多的明确指示来正确解析和处理复杂的输入格式。
我并没有一次就通过,而是尝试了数次,先贴出ac的解决方案(个人不认为这是题解/答案,只是特别语言碰到的题目考查范围外的内容):
arr = []
c = 0
while c < n:
line = list(map(int, input().split()))
arr.extend(line)
c += len(line)
##arr = arr[:n] (没有必要但是严谨
30分(很久很久以前写的)——
arr = list(map(int, input().split()))
完全忽略了题目格式,只考虑了空格分开数据。查看题解也没解决方案。一直以为问题出现在后续代码里,但尝试了更高效的算法也未能解决。
70分——
first_line = input().strip()
if ' ' in input_line:
arr = list(map(int, first_line.split()))
else:
arr = [int(first_line)]
for _ in range(1, n):
arr.append(int(input()))
只考虑了要么第一行空格输入,要么换行输入的情况。
50分——
remaining_input = ' '.join([input() for _ in range(n)])
arr = list(map(int, remaining_input.split()))
chatgpt提供。问题出在了循环n遍,即默认输入n行。
100分——
arr = []
c = 0
while c < n:
line = list(map(int, input().split()))
arr.extend(line)
c += len(line)
正确考虑了空格和换行交替出现的问题,同时对已经统计的数进行计数,确保在读取完数据后正确的结束读取。
以上。