CF1252A 题解

思路分析

前置知识:排列是没有重复元素的!

猜想

我们可以进行一种猜想,对于 \(x\),输出:

\[\begin{cases} x+1&x<N\\ 1&x=N \end{cases}\]

将代码提交上去,我们可以发现这种猜想值正确的!

证明

但是作为一名合格的 OIer我们必须证明这种做法是正确的。

对于 \(x<N\) 的情况,我们输出 \(x+1\),那么 \(diff\) 可以增加 \(|x+1-x|=|1|=1\)。因为排列没有重复元素,那么就有 \(N-1\) 这种情况,执行完后 \(diff=(N-1)\times 1=N-1\)

然后对于 \(x=N\) 的情况,我们输出 \(1\),那么增加了 \(|N-1|=N-1\)\(diff=N-1+N-1=2\times N-2\),对于 \(N\ge 2\) 的情况中,总是满足 \(2\times N-2\ge N\),这样我们就完成了我们的目的。

优化

我们可以发现 \(a\) 数组中的值在本次使用后就没有再次用过,所以就根本没有必要把整个 \(a\) 数组存储下来,我们只需定义一个 \(tmp\),记录本次读入的值。

复杂度分析

时间复杂度

我们要从 \(0\) 遍历到 \(N-1\),时间复杂度为 \(\mathcal O(n)\)

空间复杂度

优化前我们要存储整个 \(a\) 数组,空间复杂度为 \(\mathcal O(n)\)

优化后我们只需定义几个变量,空间复杂度降为 \(\mathcal O(1)\)

代码实现

#include <bits/stdc++.h>
using namespace std;
int N, tmp;
int main() {
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> tmp;
		cout << (tmp == N ? 1 : tmp + 1) << " ";
	}
	return 0;
}
posted @ 2023-09-10 14:04  群星之路  阅读(25)  评论(0)    收藏  举报