P1160 队列安排
题目描述
一个学校里老师要将班上N个同学排成一列,同学被编号为1 ~ N,他采取如下的方法:
1、先将1号同学安排进队列,这时队列中只有他一个人;
2、2 ~ N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1 ~( i ~ 1)中某位同学(即之前已经入列的同学)的左边或右边;
3、从队列中去掉M (M<N) 个同学,其他同学位置顺序不变。在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。
题解
看了下题目的描述,涉及到数据不停插入和删除,应该 用List链表比较好做吧。
首先凭着感觉写了下面的代码,但是。。。
#include<iostream>
#include<list>
using namespace std;
struct nextstu { //入列标识
int pos; //指定编号
int side; //左右边
};
int main() {
list<int> mylist; //链表作队列
int N;
cin >> N;
mylist.push_front(1); //插入第一位学生
int num = 2; //学生编号
while (num <= N) {
nextstu a;
cin >> a.pos >> a.side;
for (list<int>::iterator i = mylist.begin(); i != mylist.end(); i++) { //遍历入列
if (*i == a.pos) {
if (a.side == 0) { //左边
mylist.insert(i, num);
break;
}
else { //右边
i++;
mylist.insert(i, num);
break;
}
}
}
num++;
}
cin >> N; //移除的学生数目
while (N--) {
int m;
cin >> m;
for (list<int>::iterator i = mylist.begin(); i != mylist.end(); i++) { //遍历出列
if (*i == m) {
mylist.erase(i);
break;
}
}
}
for (list<int>::iterator i = mylist.begin(); i != mylist.end(); i++) {
cout << *i << " ";
}
return 0;
}
但是后三个测试点全TLE了。啊啊啊,好烦。
然后稍微改了亿下看看,还是不行,我吐了。
然后(迫不得已)看了别人的博客,然后照着别人思路写就行了(大概),我就这里就不写了 (偷懒)。
附:别人的博客Here,点我点我!