【Tsinghua】麵試(Interview)
麵試(Interview)
描述
某公司在對應聘者做過一輪筆試之後,從中選出成績最高的n 人繼續進行麵試。在筆試中,每位應聘者已被分配了一個整數ID,麵試時將沿用這個ID。
為公平起見,組織者決定利用會議室外的圓桌,按以下方法“隨機”確定麵試順序:第一個到達的應聘者在圓桌周圍任意選擇一個位置坐下;此後到達的每位應聘者都從前一應聘者出發,沿逆時針方向圍圓桌走過m 人(前一應聘者算作走過的第1 人,同一人可能經過多次),並緊鄰第m 人右側就座;所有應聘者到齊後,從最後到達者出發,繞圓桌以順時針方向為序進行麵試。
這裏假定應聘者到達的時刻互異,且相對的就坐位置確定後,左、右兩人之間總能插入一把椅子。
試編寫一個程序,對於任給的m 及n 個應聘者ID,確定對應的麵試順序。
輸入
共2行。
第1行包含兩個整數,以空格分隔,依次表示n和m。
第2行包含n個整數,以空格分隔,表示先後到達的n個應聘者的ID。
輸出
共1行。以空格分隔的n個整數,分別表示順次進行麵試的應聘者的ID。
輸入樣例
3 2
8 9 10
輸出樣例
10 8 9
限製
1 <= N <= 10^3
1 <= m <= 2*N
輸入的ID保證在int類型的範圍內。
提示
請借助列表實現
AC的代碼:
#include <stdio.h> int seat[3005]; int main() { int n,m; scanf("%d%d",&n,&m); int i; int ID,pos; scanf("%d",&ID); if(n==1) { printf("%d\n",ID); return 0; } seat[1]=ID; scanf("%d",&ID); seat[2]=ID; if(n==2) { printf("%d %d\n",seat[2],seat[1]); return 0; } pos=2; int j; for(i=2;i<n;i++) { scanf("%d",&ID); pos=m%i+pos; //pos 是當前應該放元素的位置 if(pos>i+1) pos=pos-i; //test //printf("pos=%d\n",pos); //移位 if(pos==i+1) seat[i+1]=ID; else { for(j=i;j>=pos;j--) seat[j+1]=seat[j]; //插入 ID seat[pos]=ID; } } /*for(i=1;i<=n;i++) printf("%d ",seat[i]); printf("\n");*/ //輸出 for(i=pos; ;i--) { if(i==0) i=n; if(i==pos+1) { printf("%d",seat[i]); break; } printf("%d ",seat[i]); } printf("\n"); return 0; }
最後更新:2017-04-03 05:39:41