【CCF CSP】 201703-2 學生排隊(100分)

試題編號:201703-2
試題名稱:學生排隊
時間限制:1.0s
內存限制:256.0MB
問題描述:
問題描述
  體育老師小明要將自己班上的學生按順序排隊。他首先讓學生按學號從小到大的順序排成一排,學號小的排在前面,然後進行多次調整。一次調整小明可能讓一位同學出隊,向前或者向後移動一段距離後再插入隊列。
  例如,下面給出了一組移動的例子,例子中學生的人數爲8人。
  0)初始隊列中學生的學號依次爲1, 2, 3, 4, 5, 6, 7, 8;
  1)第一次調整,命令爲“3號同學向後移動2”,表示3號同學出隊,向後移動2名同學的距離,再插入到隊列中,新隊列中學生的學號依次爲1, 2, 4, 5, 3, 6, 7, 8;
  2)第二次調整,命令爲“8號同學向前移動3”,表示8號同學出隊,向前移動3名同學的距離,再插入到隊列中,新隊列中學生的學號依次爲1, 2, 4, 5, 8, 3, 6, 7;
  3)第三次調整,命令爲“3號同學向前移動2”,表示3號同學出隊,向前移動2名同學的距離,再插入到隊列中,新隊列中學生的學號依次爲1, 2, 4, 3, 5, 8, 6, 7。
  小明記錄了所有調整的過程,請問,最終從前向後所有學生的學號依次是多少?
  請特別注意,上述移動過程中所涉及的號碼指的是學號,而不是在隊伍中的位置。在向後移動時,移動的距離不超過對應同學後面的人數,如果向後移動的距離正好等於對應同學後面的人數則該同學會移動到隊列的最後面。在向前移動時,移動的距離不超過對應同學前面的人數,如果向前移動的距離正好等於對應同學前面的人數則該同學會移動到隊列的最前面。
輸入格式
  輸入的第一行包含一個整數n,表示學生的數量,學生的學號由1到n編號。
  第二行包含一個整數m,表示調整的次數。
  接下來m行,每行兩個整數p, q,如果q爲正,表示學號爲p的同學向後移動q,如果q爲負,表示學號爲p的同學向前移動-q。
輸出格式
  輸出一行,包含n個整數,相鄰兩個整數之間由一個空格分隔,表示最終從前向後所有學生的學號。
樣例輸入
8
3
3 2
8 -3
3 -2
樣例輸出
1 2 4 3 5 8 6 7
評測用例規模與約定
  對於所有評測用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 1000,所有移動均合法。

代碼

C++

#include <iostream>
#include <algorithm>
#include <vector>
#define MAX_LENTHG 1000
using namespace std; 

class Temp
{
    public:
        int number;
        int postion;
};

//排隊操作 
void computer(Temp temp,vector<int> &line,int n)
{
    int now_postion=0,move_postion=0;
    for(int i=0;i<n;i++)
    {
        //如果是需要移動的學生,則記錄位置 
        if(line[i]==temp.number)
        {
            //找到位置 
            now_postion=i;
            //插入的位置 
            move_postion=now_postion+temp.postion;
            //移出隊伍 
            line.erase(line.begin()+now_postion);
            //插入隊伍 
            line.insert(line.begin()+move_postion,temp.number);
            break;
        }
    }
}

int main(int argc, char** argv) {
    int n,m;
    cin>>n;
    cin>>m;
    vector<int> line;
    Temp temp;
    //初始化隊列 
    for(int i=1;i<=n;i++)
        line.push_back(i);
    //輸入數據 
    for(int i=1;i<=m;i++)
    {
        //輸入數據 
        cin>>temp.number>>temp.postion;
        computer(temp,line,n);
    }
    //輸出 
    for(int i=0;i<n;i++)
    {
        if(i==(n-1))
            cout<<line[i];
        else 
            cout<<line[i]<<' '; 
    }

    return 0;
}

備註:

vector 修改

  • 多個元素賦值: vector .assign(); //類似於初始化時用數組進行賦值
  • 末尾添加元素: vector .push_back();
  • 末尾刪除元素: vector .pop_back();
  • 任意位置插入元素: vector .insert();
  • 任意位置刪除元素: vector .erase();
  • 交換兩個向量的元素: vector .swap();
  • 清空向量元素: vector .clear();
//移出隊伍 
line.erase(line.begin()+now_postion);
//插入隊伍 
line.insert(line.begin()+move_postion,temp.number);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章