题目
政府终于解决了全民医疗保健的问题!现在,无论贫富,每个人最终都能获得同等水平的医疗服务。
好哇!
有一个轻微的并发症。全国所有的医院都被压缩成一个地方,每次只能照顾一个人。
但别担心!此外,还制定了一个公平、高效的计算机系统,以确定谁将被服务。
你负责这个系统的编程。
这个国家的每个公民都将被分配一个唯一的数字,从1到P(这里的P是当前的人口)。它们将被放入一个队列,1在2前面,2在3前面,以此类推。医院将从这个队列中逐一处理病人。一旦市民被服务,他们会立即从队伍的前面移到后面。
当然,有时会出现紧急情况——如果你刚刚被一个蒸汽压路机碾过,你不能等到半个国家去做常规检查后再接受治疗!因此,对于这些(希望是罕见的)情况,可以使用一个快速命令将一个人移到队列的前面。其他国家的相对秩序将保持不变。
给定处理命令和快速命令的顺序,输出公民入院的顺序。
思路
思路一:
空间换时间
开一个队列链表减少插入删除操作用时
再开一个指针数组,指向对应数据的地址,减少查找用时
理论上用时最快,然而
光是开个1e9的数组就超256mb了,故pass
思路二:
从操作数只有1k个入手,所以我们最多只会N1000个数据,所以只开一个1000的数组和链表,倘若urgency的数据在1k里面,我们进行删除插入操作,不在1000里面,我们就开一个新的节点储存urgency来放到开头处(反正循环也不会再循环到这个数
代码
#include<iostream>
using namespace std;
typedef struct List
{
int data;
struct List* prev = NULL;
struct List* next = NULL;
}list;
int main()
{
int p,c;
int a = 1;
cin >> p >> c;
while(p != 0 && c != 0)
{
cout << "Case " << a++ << ":" << endl;
if(p > 2000) p = 2000;
list** arr = new list*[p];
for(int i = 0; i < p; i++)
arr[i] = new list;
for(int i = 0; i < p; i++)
arr[i]->data = i + 1;
if(p == 1)
{
arr[0]->data = 1;
arr[0]->next = arr[0];
arr[0]->prev = arr[0];
}
else
for(int i = 0; i < p; i++)
{
arr[i]->data = i + 1;
if(i == 0)
{
arr[i]->prev = arr[p - 1];
arr[i]->next = arr[i + 1];
}
else if(i == p - 1)
{
arr[i]->prev = arr[i-1];
arr[i]->next = arr[0];
}
else
{
arr[i]->next = arr[i + 1];
arr[i]->prev = arr[i - 1];
}
}//initiate
list* head = arr[0];
for(int i = 0; i < c; i++)
{
char o;
cin >> o;
if(o == 'N')
{
cout << head->data << endl;
head = head->next;
}
else if(o == 'E')
{
int urg;
cin >> urg;
list* temp;
if(head->data != urg)
{
if(urg > 2000)
{
temp = new list;
temp->data = urg;
temp->next = head;
temp->prev = head->prev;
head->prev->next = temp;
head->prev = temp;
head = temp;
}
else
{
temp = arr[urg - 1];
temp->prev->next = temp->next;
temp->next->prev = temp->prev;
temp->next = head;
temp->prev = head->prev;
head->prev->next = temp;
head->prev = temp;
head = temp;
}
}
}
}
cin >> p >> c;
//devastate
head->prev->next = NULL;
while(head)
{
list*temp = head;
head = head->next;
delete temp;
}
delete[] arr;
}
}