第三次wa了两次 原因如下呢
第一版
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
long long k;
int n , x;
vector<int> A,B;
cin >> n >> k >> x;
for( int i = 0 ; i < n ; i++){
int a;
cin >> a;
A.push_back(a);
}
for (long long i = 0 ; i < k ; i++){
rotate(A.begin(), A.begin() + x - 1, A.begin() + x );
}
for (int i = 0 ; i < n ; i ++){
if (i == 0) cout << A[i];
else cout <<" "<< A[i];
}
return 0;
1你的原始代码对每个 k 都执行一次 rotate,时间复杂度 O(k × n)
2当 k 很大时(比如 10^9),这显然会超时
3实际上,移动操作具有周期性,移动 n 次后数组会回到原始状态
所以 上面的代码的优化空间还很大 为了避免TLE 必须进行计算优化
于是有了第二版
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
long long k;
int n , x;
//vector<int> A(n); 错 不能写在读取n的前面
cin >> n >> k >> x;
vector<int> A(n);
for( int i = 0 ; i < n ; i++){
cin >> A[i];
}
int k2 = k % x;
rotate(A.begin(),A.begin()+x-k2,A.begin()+x);
for (int i = 0 ; i < n ; i ++){
if (i == 0) cout << A[i];
else cout <<" "<< A[i];
}
return 0;
}
优化思路:
计算 k % n 得到实际有效的移动次数 其实就是个周期性
通过一次操作直接得到最终结果,而不是模拟 k 次移动
这样时间复杂度从 O(k × n) 降到了 O(n),可以处理很大的 k 值。