CCF--2017-03-2--學生排隊
問題描述
試題編號: | 201703-2 |
試題名稱: | 學生排隊 |
時間限制: | 1.0s |
記憶體限制: | 256.0MB |
問題描述: | 問題描述 體育老師小明要將自己班上的學生按順序排隊。他首先讓學生按學號從小到大的順序排成一排,學號小的排在前面,然後進行多次調整。一次調整小明可能讓一位同學出隊,向前或者向後移動一段距離後再插入佇列。 輸入格式 輸入的第一行包含一個整數n,表示學生的數量,學生的學號由1到n編號。 輸出格式 輸出一行,包含n個整數,相鄰兩個整數之間由一個空格分隔,表示最終從前向後所有學生的學號。 樣例輸入 8 樣例輸出 1 2 4 3 5 8 6 7 評測用例規模與約定 對於所有評測用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 1000,所有移動均合法。 |
此題用陣列模擬排列的過程,
#include <iostream> #include <algorithm> using namespace std; const int N = 1000; int s[N + 1];//學生佇列 int main(void) { int n,m; scanf("%d",&n);//n個學生 for(int i=1;i<=n;i++) s[i] = i; scanf("%d",&m);//m個命令 for(int j=0;j<m;j++){ int p,q; scanf("%d %d",&p,&q); if(q > 0) { int book = 0;//book表示操作執行的次數 int flag = 0;//flag代表是否是第一次進入迴圈 for(int i=1;i<=n;i++){ if(s[i] == p && flag == 0){//找到編號為p的學生 flag = 1; s[i] = s[i+1];//後一位前移 book ++; continue; } if(flag == 1 && book < q){//繼續前移,知道執行夠q次(後移p個單位就相當於後移p次) s[i] = s[i+1]; book ++; } else if(book == q && flag == 1) {s[i] = p;break;} } } if(q < 0) { int book = 0;//book表示操作執行的次數 int flag = 0; for(int i=n;i>=1;i--){ if(s[i] == p && flag == 0){ flag = 1; s[i] = s[i-1]; book --; continue; } if(flag == 1 && book > q){ s[i] = s[i-1]; book --;//直接book--就可以比較。通過負數比較 } else if(book == q && flag == 1) {s[i] = p;break;} } } } for(int i=1;i<=n;i++) printf("%d ",s[i]); return 0; }