CCF CSP 201703-2 學生排隊(Java-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,所有移動均合法。


問題鏈接:無。

問題描述(參見上文)。

問題分析:這是一個模擬題,關鍵在於數據表示。

程序說明:數組sno2pos[]用於存儲各個學生(學號)所在的位置;數組pos2sno[]是索引,pos2sno[i]=s表示學生s位於位置i。這個程序應該是最快速的版本。提交後得100分的Java語言程序如下:

注意事項:提交時修改類名爲Main;同時,去掉所有註釋,否則容易造成編譯錯誤

import java.util.Scanner;

public class T20170302 {
	static int N = 1000;
	int[] sno2pos = new int[N + 1];// 學號所在位置
	int[] pos2sno = new int[N + 1];// 位置上的學號

	public static void main(String[] args) {
		new T20170302().main();
	}

	public void main() {
		int n, m, p, q;

		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();

		// 初始化
		for (int i = 1; i <= n; i++) {
			sno2pos[i] = i;
			pos2sno[i] = i;
		}

		// 模擬移動過程
		for (int i = 1; i <= m; i++) {
			int pos1, pos2 = 0, sno2;

			p = sc.nextInt();
			q = sc.nextInt();

			if (q != 0) {
				int move = (q > 0) ? 1 : -1;
				int end = (q > 0) ? q : -q;

				pos1 = sno2pos[p];
				for (int j = 1; j <= end; j++) {
					sno2 = pos2sno[pos1 + move];
					pos2 = sno2pos[sno2];

					pos2sno[pos1] = sno2;
					sno2pos[sno2] = pos1;

					pos1 = pos2;
				}
				pos2sno[pos2] = p;
				sno2pos[p] += q;
			}
		}

		// 讓空格和數字成對打印,避免空格落空,造成結果不匹配
		System.out.print(pos2sno[1]);
		for (int i = 2; i <= n; i++) {
			System.out.print(" " + pos2sno[i]);
		}

		sc.close();
	}

}





發佈了128 篇原創文章 · 獲贊 252 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章