CCF CSP 201703-2 學生排隊


 博客中的文章均為meelo原創,請務必以鏈接形式注明本文地址

CCF CSP 201703-2 學生排隊

問題描述

  體育老師小明要將自己班上的學生按順序排隊。他首先讓學生按學號從小到大的順序排成一排,學號小的排在前面,然后進行多次調整。一次調整小明可能讓一位同學出隊,向前或者向后移動一段距離后再插入隊列。
  例如,下面給出了一組移動的例子,例子中學生的人數為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++的list模板類。
用一個vector記錄指向每一個學生的指針。
代碼中使用了list模板類的splice方法,可以很方便地把一個元素從原來的位置刪除並插入新的位置。
 

代碼

C++

#include <vector>
#include <list>
#include <cstdio>

using namespace std;

int main() {
    int N, M;
    scanf("%d%d", &N, &M);
    list<int> lst;
    vector<list<int>::iterator> vec(N+1);
    for(int i=1; i<=N; i++) {
        lst.push_back(i);
        vec[i] = --lst.end();
    }
    for(int m=0; m<M; m++) {
        int p, q;
        scanf("%d%d", &p, &q);
        list<int>::iterator inpos = vec[p];
        if(q>0) {
            q++;
            while(q) {
                inpos++;
                q--;
            }
        }
        else if(q<0) {
            while(q) {
                inpos--;
                q++;
            }
        }
        lst.splice(inpos, lst, vec[p]);
    }
    for(list<int>::iterator it=lst.begin(); it!=lst.end(); it++) {
        printf("%d ", *it);
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM