1. 程式人生 > >CCF--2017-03-2--學生排隊

CCF--2017-03-2--學生排隊

問題描述

試題編號: 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,所有移動均合法。

 

此題用陣列模擬排列的過程,

#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;
}