数组的循环移动

问题描述:

给定一个长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;


}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值