UVA1006 Fixed Partition Memory Management

题意:

题目链接
有N个程序需要运行,同一个程序在不同的运行空间大小中运行时间不同(一个程序在2G的内存下运行5s,5G的内存下运行2s .etc)
给出M个运行区域,每个区域有各自的空间,同一时间一个区域只能运行一个程序
求如何安排使得所有程序的结束时间之和最小 N<=10 M<=50
(这样说好像也说不太清楚,其实看样例最好懂了/xyx)

思路:

这道题的建模极为经典
对于一个运行区域,设每个程序依次用时t1,t2....tk
那么这个区域的总用时为ri=kt1+(k-1)t2+....+tk
容易发现,倒数第i个的实际贡献是itk
于是从每一个程序出发向每个运行区域(共n
m个代表这个区域的倒数第若干个运行)连边,边权为序数*程序用时
然后就是一个二分图带权最小匹配了

code:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
using namespace std;
int m,n;
int mem[15];
int ep1[55],ep2[15][55],lk[55][15][55],match[15][55],slack[15][55],val[15][55];
bool vis1[55],vis2[15][55];
pair<int,int>fm[55];
inline int read()
{
    int s=0,w=1; char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-')w=-1;
    for(;isdigit(ch);ch=getchar())s=(s<<1)+(s<<3)+(ch^48);
    return s*w;
}
inline void _init()
{
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            for(int k=1;k<=n;++k)
                lk[i][j][k]=-1e9;
    for(int i=1;i<=m;++i)mem[i]=read();
    for(int i=1;i<=n;++i)
    {
        int k=read();
        int pre_s=read(),pre_t=read();
        for(int j=2;j<=k;++j)
        {
            int s=read(),t=read();
            for(int e=1;e<=m;++e)
                if(mem[e]>=pre_s&&mem[e]<s)
                    for(int p=1;p<=n;++p)
                        lk[i][e][p]=-pre_t*p;
            pre_s=s,pre_t=t;
        }
        for(int e=1;e<=m;++e)
            if(mem[e]>=pre_s)
                for(int p=1;p<=n;++p)
                    lk[i][e][p]=-pre_t*p;
    }
}
bool dfs(int x)
{
    vis1[x]=1;
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
        {
            if(vis2[i][j]) continue;
            int gap=ep1[x]+ep2[i][j]-lk[x][i][j];
            if(!gap)
            {
                vis2[i][j]=1;
                if(match[i][j]==-1||dfs(match[i][j]))
                {
                    match[i][j]=x;
                    return true;
                }
            }
            else slack[i][j]=min(slack[i][j],gap);
        }
    return false;
}
inline void KM()
{
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
            match[i][j]=-1,ep2[i][j]=0;
    for(int i=1;i<=n;++i)
    {
        ep1[i]=-1e9;
        for(int j=1;j<=m;++j)
            for(int k=1;k<=n;++k)
                ep1[i]=max(ep1[i],lk[i][j][k]);
    }
    for(int i=1;i<=n;++i)
    {
        for(int j=1;j<=m;++j)
            for(int k=1;k<=n;++k)
                slack[j][k]=1e9;
        while(1)
        {
            for(int j=1;j<=n;++j)vis1[j]=0;
            for(int j=1;j<=m;++j)
                for(int k=1;k<=n;++k)
                    vis2[j][k]=0;
            if(dfs(i)) break;
            int d=1e9;
            for(int j=1;j<=m;++j)
                for(int k=1;k<=n;++k)
                    if(!vis2[j][k])
                        d=min(d,slack[j][k]);
            for(int j=1;j<=n;++j)
                if(vis1[j]) ep1[j]-=d;
            for(int j=1;j<=m;++j)
                for(int k=1;k<=n;++k)
                {
                    if(vis2[j][k]) ep2[j][k]+=d;
                    else slack[j][k]-=d;
                }
        }
    }
}
inline void _print()
{
    int ans=0;
    for(int i=1;i<=n;++i)
        ans-=ep1[i];
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
            ans-=ep2[i][j];
    printf("Average turnaround time = %.2f\n",(double)ans/n);
    memset(val,0,sizeof(val));
    for(int i=1;i<=m;++i)
        for(int j=1;j<=n;++j)
            if(match[i][j]!=-1)
            {
                fm[match[i][j]]=make_pair(i,j);
                val[i][j]=lk[match[i][j]][i][j]/j;
            }
    for(int i=1;i<=m;++i)
        for(int j=n-1;j;--j)
            val[i][j]+=val[i][j+1];
    for(int i=1;i<=n;++i)
    {
        int &u=fm[i].first,&v=fm[i].second;
        printf("Program %d runs in region %d from %d to %d\n",i,u,-val[u][v]+lk[i][u][v]/v,-val[u][v]);
    }
    puts("");
}
int main()
{
    for(int q=1;;++q)
    {
        m=read(),n=read();
        if(!m && !n) break;
        _init();KM();
        printf("Case %d\n",q);
        _print();
    }
    return 0;
}

代码太丑,巨佬勿喷/xyx

原文地址:https://www.cnblogs.com/zmyzmy/p/12539823.html

时间: 2024-10-25 01:46:40

UVA1006 Fixed Partition Memory Management的相关文章

Fixed Partition Memory Management UVALive - 2238 建图很巧妙 km算法左右顶点个数不等模板以及需要注意的问题 求最小权匹配

/** 题目: Fixed Partition Memory Management UVALive - 2238 链接:https://vjudge.net/problem/UVALive-2238 题意:lv 思路:lrjP352. 来自lrj训练指南. n个程序作为左边结点, n*m个结点在右边:由于只要求n个程序在右边能找到的匹配点,km算法可以求解.修改nx,ny的值. if(f[i][j]==-1){ for(int k = 1; k <= n; k++) love[i][j*n+k-

UVALive 2238 Fixed Partition Memory Management 固定分区内存管理(KM算法,变形)

题意:目前有一部分可用内存,分为m个大小固定的区域.现有n个程序要执行,每个程序在不同大小的内存中运行所需的时间不同,要使运行完所有程序所耗时最少,问每个程序在哪块区域中从什么时间运行到什么时间,以及运行完所有程序的平均周转时间. 思路:各种记录有点麻烦! m个区域看成m台内存大小为该区域大小的计算机,然后n个程序分别要选择在其中一台计算机中运行.由于运行有先后顺序,这也很影响平均周转时间,所以最极端时,其中某台计算机可能有n个程序要运行,那么每台计算机就得有n个位置供挑选.所以一共有n*m个位

Objective -C Memory Management 内存管理 第一部分

Objective -C Memory Management??内存管理??第一部分 Memory management is part of a more general problem in programming called resource management. 内存管理是资源管理的一部分. Every computer system has finite resources for your program to use. These include memory, open fi

《modern operating system》 chapter 3 MEMORY MANAGEMENT 笔记

MEMORY MANAGEMENT The part of the operating system that manages (part of) the memory hierarchy is called thememory manager 这章感觉有点多...80 多页..看完都看了两天多,做笔记就更有点不想...有点懒了..但是要坚持下去,可以自己较劲 对于内存的抽象,最简单的抽象就是...没有抽象 和第一次看不一样,把summary放在最前面,对整个mamory management的

Android Memory Management, OutOfMemoryError

A Android框架强制每个进程的24 MB内存限制.在一些旧的设备,如在G1,限制为16 MB 更低,更重要的是,由位图使用的内存限制.处理图像的应用程序,它是很容易达到此限制,并获得与OOM 异常死亡 的过程:E / dalvikvm堆(12517):1048576字节外部分配这个 过程中过大的E / GraphicsJNI(12517): VM将不会让我们分配1048576字节 / AndroidRuntime(12517):关闭VM / dalvikvm(12517):主题ID = 1

2015.12.21 内存管理(memory management)

Memory Management 1.什么是内存管理? 程序在运行过程中管理内存分配的过程,当需要内存的时候就申请一片内存空间,不需要就释放掉. 2.如何去管理内存 站在分配对象拥有权的角度来操作内存. 3.内存管理的两种办法 a. MRR(Manual Retain Release)手动管理,实现的机制:reference counting(引用计数机制). b. ARC(Auto Reference Counting)自动引用计数,实现机制:系统在程序编译阶段自动添加了释放对象的办法. 4

Objective-C Memory Management Being Exceptional 异常处理与内存

Objective-C Memory Management ? ?Being Exceptional ?异常处理与内存 3.1Cocoa requires that all exceptions must be of type NSException cocoa?需要所有的异常是NSException类型的. so even though you can throw an exception from other objects, Cocoa isn't set up to deal with

Summary of Memory Management Methods

Summary of Memory Management Methods Table 18-1 summarizes the various memory management methods. If you do not enable automatic memory management, then you must separately configure one memory management method for the SGA and one for the PGA. Note:

Automatic Tuning of Memory Management

4.2.2 Automatic Tuning of Memory Management Two memory management initialization parameters, MEMORY_TARGET and MEMORY_MAX_TARGET, enable automatic management of the System Global Area (SGA), Program Global Area (PGA), and other memory required to run