THU2015 fall 1-3 Interview

THU2015 fall 1-3 Interview

描述

  某公司在对应聘者做过一轮笔试之后,从中选出n 人继续进行面试,每位应聘者被分配了一个整数ID。

  为公平起见,组织者决定利用会议室外的圆桌,按以下方法“随机”确定面试顺序:第一个到达的应聘者在圆桌周围任意选择一个位置坐下;此后到达的每位应聘者都从前一应聘者出发,沿逆时针方向围圆桌走过m 人(前一应聘者算作走过的第1 人,同一人可能经过多次),并紧邻第m 人右侧就座;所有应聘者到齐后,从最后到达者出发,绕圆桌以顺时针方向为序进行面试。

THU2015 fall 1-3 Interview_第1张图片

  这里假定应聘者到达的时刻互异,且相对的就坐位置确定后,左、右两人之间总能插入一把椅子。

  试编写一个程序,确定面试顺序。

输入

  共2行。

  第1行包含两个整数, n和m。

  第2行包含n个整数,表示先后到达的n个应聘者的ID。

输出

  共1行。以空格分隔的n个整数,分别表示顺次进行面试的应聘者的ID。

输入样例

5	3
6	7	8	9	10

输出样例

10 6 8 9 7

限制

  1 ≤ n ≤ 10^3

  1 ≤ m ≤ 2*n

  输入的ID保证在int类型的范围内。

  必须使用链表实现。

  时间:1 sec

  空间:256 MB

提示

一级提示

  循环链表


代码如下:

#include <stdio.h>
#include <stdlib.h>
const int SZ = 1 << 20;  //提升IO buff 
struct fastio{
	char inbuf[SZ];
	char outbuf[SZ];
	fastio(){
		setvbuf(stdin, inbuf, _IOFBF, SZ);
		setvbuf(stdout, outbuf, _IOFBF, SZ);
	}
}io;
typedef struct Line
{
	Line *prov,*next;
	int id;
}Line;

int main()
{
	int n, m;	
	scanf("%d %d", &n, &m);

	Line *head = (Line *)malloc(sizeof(Line));
	head->next = head;
	head->prov = head;
	scanf("%d", &head->id);
	Line *p = (Line *)malloc(sizeof(Line));
	p = head;

	for (int i = 1; i < n; i++)
	{
		Line *one = (Line *)malloc(sizeof(Line));
		int t = m;
		scanf("%d", &one->id);
		while (t--) p = p->next;

		one->next = p->next;
		one->prov = p;
		p->next->prov = one;
		p->next = one;
	}
	
	p = p->next;
	while (n--)
	{		
		printf("%d ", p->id);
		Line *tmp = p;
		p = p->prov;
		free(tmp);
	}
	//system("pause");
	return 0;
}



你可能感兴趣的:(THU2015 fall 1-3 Interview)