一、题目 二、解题思路 由于该题每步都为插入,因此为明显的链表题。由于不想写链表,首先尝试使用数组去求解:直接记录每位同学的位置,插入情况就两种,插在邻居的左边或者右边;当插在邻居左边时,新插入同学的位置为邻居的位置,然后邻居及站在该邻居后面的同学位置全都加一,而插在邻居右边时,新插入同学的位置为邻居的位置+1,该邻居后面的同学同样位置全都加一。很遗憾,超时!只能写链表了。 由于担心超时,我采用了空间换时间的策略,使用双链表存储整个队列。对于每个同学,我们只需要记录其左右邻居是谁,当知道队头或者队尾时,我们就可以输出整个队列。实际上,只记录前驱结点或者后驱节点同样可以求解,但花费时间将会增大。对于删除操作,实际上我们并不需要真正删除,只需再开辟一个数组,记录哪些元素被删除,删除的元素在输出结果时跳过即可。 三、代码 #include<iostream> #include<string> #include<vector> #include<map> #include<algorithm> #include<cmath> #include<queue> using namespace std; int main(){ int f