数据结构算法——1013. 医疗调度系统

题目

政府终于解决了全民医疗保健的问题!现在,无论贫富,每个人最终都能获得同等水平的医疗服务。

好哇!

有一个轻微的并发症。全国所有的医院都被压缩成一个地方,每次只能照顾一个人。

但别担心!此外,还制定了一个公平、高效的计算机系统,以确定谁将被服务。

你负责这个系统的编程。

这个国家的每个公民都将被分配一个唯一的数字,从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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值