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,所有移動均合法。
import java.util.Scanner;
public class T2017_03_2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 學生數量
int n = sc.nextInt();
// arr數組從下標1開始至n記錄初始位置
int[] arr = new int[n+1];
for (int i = 1; i < arr.length; i++) arr[i] = i;
// 調整次數
int m = sc.nextInt();
// 每次進行調整
// 由於輸入保證合法,所以就不做數組越界處理了!
while(m-- > 0){
int p = sc.nextInt(), q = sc.nextInt(); // 學號p, 移動q
// 找到學號p同學的位置
int index = 0;
for (int i = 1; i < arr.length; i++) {
if(arr[i]==p){ index = i; break; }
}
// 根據q的正負值進行移動
if(q > 0){ // 後移
// 從arr數組中下標爲 index+1 至 index+q 的同學前移一格
for (int i = index+1; i <= index+q; i++) {
arr[i-1] = arr[i];
}
}else{ // 前移
// 從arr數組中下標爲 index+q(q<=0) 至 index-1 的同學後移一格
for (int i = index-1; i >= index+q; i--) {
arr[i+1] = arr[i];
}
}
// 下標爲index的同學(學號爲p)移至index+q位置
arr[index+q] = p;
} // end while
// 輸出結果
for (int i = 1; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
sc.close();
}
}