資源限制
時間限制:1.0s 記憶體限制:256.0MB
———————————————————————————————————————————
問題描述
給定一個n長的數列,有m次操作,第i次操作表示将整個數列循環移動mi位,詢問每次操作結束後的開頭k個數字
———————————————————————————————————————————
輸入格式
第一行三個整數n,m,k。
第二行n個整數表示數列。
接下來m行,每行一個整數mi,表示移動位數,若mi為正,表示向左移mi位,若mi為負數,表示向右移-mi位。
輸出格式
m行,每行k個數,表示開頭k個數字
———————————————————————————————————————————
樣例輸入
5 2 3
1 2 3 4 5
2
-2
樣例輸出
3 4 5
1 2 3
———————————————————————————————————————————
資料規模和約定
n<=1000000
m<=100000
k<=min(10,n)
mi<=100000000
解題代碼如下:
#include<bits/stdc++.h>
using namespace std;
int num[1000005];
//所有變量的範圍都沒有超過2的十次方是以int類型可以滿足該題;
int main()
{
int n,m,k;
//輸入部分;
cin >> n >> m >> k;
for(int i = 0; i < n; i++)
{
cin >> num[i];
}
int start = 0,mov; //輸出的起點位置和移動步數;
for(int j = 0; j < m; j++)
{
cin >> mov;
mov %= n;//将移動步數縮小到[-n,n];
if(mov < 0)//将移動步數縮小到[1,n];
mov = n+mov;
start = (start+mov)%n;//改變輸出起點;
//輸出部分;
for(int i = start; i <start+k; i++)
{
i == start ? cout << num[i%n] : cout << " " << num[i%n];//注意可能start+i可能大于n,需要取餘;
//控制輸出格式;
}
if(j != m-1)cout << endl;//控制輸出格式;
}
return 0;
}
注意:
1.起始位置(start)一定要初始化!!
2.數組定義一個全局的一維數組,要開10的6次方的大小的。