CCF 學生排隊(附分析思想)
問題描述
試題編號: | 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,所有移動均合法。
|
分析:將向前移動和向後移動分成兩種情況,排序方式不同。
實現程式碼:
import java.util.Scanner; /** * Created by YTY on 2018/3/16 0016. */ public class K{ public static void main(String[] args){ Scanner sca=new Scanner(System.in); int n=sca.nextInt(); int a[]=new int[n]; for(int i=1;i<n+1;i++){ a[i-1]=i; } int m=sca.nextInt(); for(int i=0;i<m;i++){ int p=sca.nextInt();//學號 int q=sca.nextInt();//移動位置 int t=0;//學號位置 for(int j=0;j<n;j++){ if(a[j]==p){ t=j; break; } } if((q+t<n)&&(q>0)){ int x=a[t]; for(int z=t;z<q+t;z++){ a[z]=a[z+1]; } a[q+t]=x; } if((q+t>=0)&&(q<0)){ int x=a[t]; for(int z=t-1;z>=q+t;z--){ a[z+1]=a[z]; } a[t+q]=x; } } for(int i=0;i<n-1;i++){ System.out.print(a[i]+" "); } System.out.print(a[n-1]); } }