题目描述
问题描述
给定一个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
java代码
代码如下(示例):
public class Main {
public static void main(String[] args)
{
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();//数列长度
int m=scanner.nextInt();//m次操作
int k=scanner.nextInt();//开头k个数字
int num[]=new int[n+1];
for (int i = 1; i <=n; i++) {
num[i]=scanner.nextInt();
}
int ptr=1;
for (int i = 0; i <m; i++)//m次操作
{
int caozuo=scanner.nextInt();
if(caozuo>0)
{
if(ptr+caozuo==n)
{
ptr=n;
}
else {
ptr=(ptr+caozuo)%n;
}
int temp=ptr;//记录指针起始位置
for (int j = 0; j <k; j++) {
System.out.print(num[ptr]+" ");
ptr++;
if(ptr==n+1)
{
ptr=1;
}
}
System.out.println();
ptr=temp;
}
else if (caozuo<0)
{
caozuo%=n;//后退caozuo步
if(caozuo<0)
ptr+=caozuo;
if (ptr<=0) {
ptr=n+ptr;
}
int temp=ptr;
for (int j = 0; j <k; j++) {
System.out.print(num[ptr]+" ");
ptr++;
if(ptr==n+1)
{
ptr=1;
}
}
System.out.println();
ptr=temp;
}
else {
int temp=ptr;
for (int j = 0; j <k; j++) {
System.out.print(num[ptr]+" ");
ptr++;
if(ptr==n+1)
{
ptr=1;
}
}
ptr=temp;
System.out.println();
}
}
}
}