• [POJ1193][NOI1999]内存分配(链表+模拟)


    题意

    T

    内存占用情况

    进程事件

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    进程A申请空间(M=3, P=10)<成功>

    1

    A

    2

    A

    B

    进程B申请空间(M=4, P=3)<成功>

    3

    A

    B

    进程C申请空间(M=4, P=4)<失败进入等待队列>

    4

    A

    B

    D

    进程D申请空间(M=1, P=4)<成功>

    5

    A

    C

    D

    进程B结束,释放空间

    进程C从等待队列取出,分配空间

    进程E申请空间(M=3, P=4)<失败进入等待队列>

    6

    A

    C

    D

    7

    A

    C

    D

    8

    A

    C

    E

    进程D结束,释放空间

    进程E从等待队列取出,分配空间

    9

    A

    E

    进程C结束,释放空间

    10

    A

    E

    11

    E

    进程A结束,释放空间

    12

    进程E结束,释放空间

    具体题目看http://poj.org/problem?id=1193 是中文的

    思路

    自己一开始想暴力模拟,单身很难实现

    后来“抄”了std的代码,用的是链表+二叉堆(有吗?)

    代码

    //author: sysky
    //copy: XuHt
    #include<cstdio>
    #include<vector>
    #include<algorithm>
    #include<queue>
    #define INF 0x3fffffff
    using namespace std;
    int n,w=INF,cnt=0;
    struct data{
        int t,m,p,s;
        bool operator <(const data x)
        const{
            return s<x.s;
        }
    }x; 
    vector<data> p;
    queue<data> q;
    bool work_in(int t) {
        if (p.empty() || p[0].s >= x.m) {
            x.s = 0;
            x.t = t;
            p.push_back(x);
            sort(p.begin(), p.end());
            return 1;
        }
        for (unsigned int i = 1; i < p.size(); i++)
            if (p[i].s - (p[i-1].s + p[i-1].m) >= x.m) {
                x.s = p[i-1].s + p[i-1].m;
                x.t = t;
                p.push_back(x);
                sort(p.begin(), p.end());
                return 1;
            }
        int sz = p.size();
        if (n - (p[sz-1].s + p[sz-1].m) >= x.m) {
            x.s = p[sz-1].s + p[sz-1].m;
            x.t = t;
            p.push_back(x);
            sort(p.begin(), p.end());
            return 1;
        }
        return 0;
    }
    void work_out() {
        int nw = INF;
        for (unsigned int i = 0; i < p.size(); i++)
            if (p[i].t + p[i].p == w) p.erase(p.begin() + i--);
            else nw = min(nw, p[i].t + p[i].p);
        while (q.size()) {
            x = q.front();
            if (work_in(w)) {
                nw = min(nw, q.front().t + q.front().p);
                q.pop();
                cnt++;
            } else break;
        }
        w = nw;
    }
    void work(int t, int m, int p) {
        while (t >= w) work_out();
        x.t = t;
        x.m = m;
        x.p = p;
        if (work_in(t)) w = min(w, t + p);
        else q.push(x);
    }
    int main()
    {
        scanf("%d",&n);
        int t0,m0,p0;
        while(scanf("%d%d%d",&t0,&m0,&p0)==3 &&!(t0==0&&m0==0&&p0==0))
            work(t0,m0,p0);
        while(q.size()) work_out();
        int ans=w;
        for(int i=0;i<p.size();i++)
            ans=max(ans,p[i].t+p[i].p);
        printf("%d
    %d
    ",ans,cnt);
        return 0;
    }

    我太菜了

  • 相关阅读:
    centos部署bladex boot 之docker安装
    git ssh key创建和github使用
    Debian root登录设置
    Linux软件源
    Secure backup
    Python简易web服务
    好久没有更新博客了
    Python实现无向图最短路径
    DWZ使用中遇到的坑
    tronado学习
  • 原文地址:https://www.cnblogs.com/lincold/p/10228889.html
Copyright © 2020-2023  润新知