閱讀931 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【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

  上一篇:go linux c 文件 read(讀) 和 write (寫) 代碼分析
  下一篇:go poj 2081 Recaman&#39;s Sequence【hash】