天天看點

【藍橋杯 C++】試題 算法訓練 移動

資源限制

時間限制: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次方的大小的。

繼續閱讀