constint N = 1000; structNode { int val, next; } list[N];
intmain(){ int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= n; ++i) { list[i].val = i; list[i].next = i + 1; } list[n].next = 1; // 模拟 for (int cur = 1, i = 0; i < n; ++i, cur = list[cur].next) { for (int j = 2; j < m; ++j) cur = list[cur].next; printf("%d ", list[list[cur].next].val); list[cur].next = list[list[cur].next].next; } return0; }
P1160 队列安排
题目描述
一个学校里老师要将班上 N
个同学排成一列,同学被编号为 1 ∼ N,他采取如下的方法:
先将 1
号同学安排进队列,这时队列中只有他一个人;
2 ∼ N
号同学依次入列,编号为 i
的同学入列方式为:老师指定编号为 i 的同学站在编号为 1 ∼ (i − 1)
中某位同学(即之前已经入列的同学)的左边或右边;
从队列中去掉 M
个同学,其他同学位置顺序不变。
在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。
输入格式
第一行一个整数 N,表示了有
N 个同学。
第 2 ∼ N 行,第 i 行包含两个整数 k, p,其中 k 为小于 i 的正整数,p 为 0 或者 1。若
p 为 0,则表示将 i 号同学插入到 k 号同学的左边,p 为 1 则表示插入到右边。
第 N + 1 行为一个整数 M,表示去掉的同学数目。
接下来 M 行,每行一个正整数
x,表示将 x 号同学从队列中移去,如果 x
号同学已经不在队列中则忽略这一条指令。