一个有趣的题目[CF730G|2016ACM NEERC G] Car Repair Shop

来源:互联网 发布:linux反编译class文件 编辑:程序博客网 时间:2024/06/01 20:28

Car Repair Shop

  • Car Repair Shop
    • 题意
    • 分析
    • 代码
    • 感想

题意

题目链接
就是要求对修车按顺序安排时间,如果订单提出时间有空就分配给它,没有就从第1天开始找一个合适大小的时段分配。

分析

这题实际上就是个简单模拟,考虑到订单最多200,但是的时间范围1e9,时间点不能离散开,那么就一段一段分配时间。
至于说有趣,也恰好这几天操作系统讲到了存储器分配这里,这个分配的过程尤其是从第1天开始查找合适大小的空段的模式,极其像操作系统里的存储器分配算法,基于顺序搜索的动态分区分配算法首次适应(first fit, FF)算法。
因此我的做法就是建一个list,一开始插入【1,1e9+5e6】起始时间对,表示空闲时间。每次订单请求先依次轮询全部的时间对,看是否有空闲时间对涵盖请求(即包含请求的开始时间、持续时间)。如果都不能满足,那么再从头轮询,检索到最先满足持续时长的时段。分配后,将原有的时间对拆成一或两个时间对(如果分配掉的时间刚好在头或尾就拆成一个)。
过程中保证时间对的有序,采用list是为了提高删除、插入效率。

代码

#include <iostream>#include <list>using namespace std;int main(int argc, char const *argv[]){    int n, s, d, ansl, ansr;    list<pair<int, int> > mem;    cin>>n;    mem.push_front(make_pair(1, 1e9 + 5e6));    for (int i = 0; i < n; ++i)    {        cin>>s>>d;        ansl = -1;        ansr = -1;        for(list<pair<int, int> >::iterator iter = mem.begin(); iter != mem.end(); ++iter)        {            //cerr<<iter->first<<' '<<iter->second<<endl;            if (iter->first > s)            {                break;            }            if (iter->first <= s && iter->second >= s + d - 1)            {                ansl = s;                ansr = s + d - 1;                if (s > 1)                    mem.insert(iter, make_pair(iter->first, s - 1));                iter->first = s + d;                break;            }        }        if (ansl == -1)        {            for(list<pair<int, int> >::iterator iter = mem.begin(); iter != mem.end(); ++iter)            {                //cerr<<iter->first<<' '<<iter->second<<endl;                if (iter->second - iter->first + 1 >= d)                {                    ansl = iter->first;                    ansr = iter->first + d - 1;                    if (iter->second - iter->first + 1 - d > 0)                    {                        iter->first = iter->first + d;                        break;                    }                    else                    {                        iter = mem.erase(iter);                        --iter;                    }                }            }        }        cout<<ansl<<' '<<ansr<<endl;    }    return 0;}

感想

最近看到龙芯他们开源CPU给高校,也真的是现行教学体制太垃圾,整个计算机学下来根本不成体系,资源不足,实验不够深入,理论教学简直最上跑火车,希望这个计划能真的改善情况,可惜我已经赶不上了。
今天看了胡伟武纪念龙芯15周年的文章,一直以来很关注龙芯,曾经还希望能去参与,至今觉得没学电子而可惜。文章话语能看得出,他确实是个实在的搞技术搞研究的,早些年对他在龙芯这样一个学术科研机构大肆渲染毛主席等等行为感到有些奇怪,政治色彩过于浓厚。现在确实可以理解了,龙芯一路坎坎坷坷,命途多舛。文章中说前几年因为学院派思路走了弯路,导致国家转而支持引进,为了龙芯活下去确实也是相当不容易。文章中大量提到现实中龙芯开发遇到的Bug,如数家珍,确实是投入了大量心血,甚至有一大半代码是他自己亲自写的,感到系统编程能力确实难但确实重要,行文直接提了许多操作系统、体系结构中的细节,感到自己还是要好好学好这些。

0 0