面试(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;
}