问题描述:
给定一个长n的数组,有m次操作,第i次操作表示将整个数列循环移动mi位,请输出操作结束后的开头k个数字。
注意,由于本程序部分测试数据需要进行大规模输入,因此,如果使用cin的话,建议在代码中加上以下语句,否则会超时(如果使用scanf不需要这些语句):
#include<iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
//其它语句
}
但使用以上代码后,不可再使用scanf和printf,只能用cin和cout。
输入说明:
第一行三个整数n,m,k。
第二行n个整数表示数组的元素。
第三行m个整数,其中第i个整数mi,表示将数组循环移动的位数,若mi为正,表示向左移mi位,若mi为负数,表示向右移|mi|位。
比如,mi为1,则表示第0个元素移动到数组的最后,第1个元素左移到第0个位置,......
n<=100000
m<=100000
k<=min(10,n)
|mi|<=100000
说明:只有一个测试数据达到以上规模,其它数据都是很小规模的啦。
输出说明:
输出k个数,表示操作结束后开头的k个数字,每个数字后都跟一个空格。
代码段:
#include<iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
long long n, m;
int k;
int arrN[100000],arrM[100000];
cin >> n >> m >> k;
for (int i = 0; i < n; i++) {
cin >> arrN[i];
}
for (int i = 0; i < m; i++) {
cin >> arrM[i];
int temp[100000];
if (arrM[i] > 0) {
for (int j = 0; j < n; j++) {
if((j+arrM[i])<n){
temp[j]=arrN[j];
arrN[j]=arrN[j+arrM[i]];
}else{
arrN[j]=temp[j-(n-arrM[i])];
}
//temp[j]=arrN[j];
// arrN[n - arrM[i] + j] = arrN[j];
}
}
else if (arrM[i] < 0) {
int M = 0 - arrM[i];
for (int j =n-1; j>=0; j--) {
if(j-(n-M)>=0&&(j-M)>=0){
temp[j]=arrN[j];
arrN[j]=arrN[j-M];
}else if((j-M)>=0){
arrN[j]=arrN[j-M];
}else{
arrN[j]=temp[n+j-M];
}
}}
else {//arrM[i]=0;
}
}
for (int i = 0; i < k; i++) {
cout << arrN[i] << " ";
}
return 0;
}