题目大意:

m(m<=10)个内存区域,n(n<=50)个程序。找出一个方案来,使得平均结束时刻尽量小。题目保证有解。

同一个程序运行在不同大小的内存区域内,其运行时间不同。(注意,这里说的大小是指整个内存区域大小,而不是说:该程序之前有程序运行,占用了一部分内存,剩下的那部分内存大小。。。。。。。)

输入:m和n,然后是m个数表示内存区域大小。再是n行,每行第1个数为情况总数k(k<=10),然后是k对整数s1,t1,s2,t2……sk,tk,满足si<si+1表示在各个内存中的运行时间。

如果内存块总大小s不足s1,则无法在该内存块运行该程序;当si<=s<si+1时,运行时间为ti;当s>=sk时,运行时间为tk

输出:平均最小结束时间和调度方案。

(转自http://blog.csdn.net/u014679804/article/details/46725083)

题解:发现早运行的程序,对后面的结束时刻的影响是固定的,即某个内存区域倒数第p个,贡献为pT,T为程序在某个内存区域的运行时间。于是可以左边为程序,右边为每个内存区域倒数第几个运行,对应连边,边权为贡献,求最小权匹配。不难发现不会出现倒数第一匹配,倒数第二没匹配,倒数第三匹配的情况(何不匹配倒数第二呢?)

拍了很久,平均时间没有错,方案小数据看了很多组也没组

估计是SPJ没有或者不对。。。

网上的程序试了一个,都跟样例输出的一模一样,其他数据也都一模一样。。。

就当是对的吧。。OI一般也不会让输出方案反正。。

 #include <cstdio>
#include <cstring>
#define max(a, b) ((a) > (b) ? (a) : (b))
template<class T>
inline void swap(T &a, T &b)
{
T tmp = a;a = b;b = tmp;
}
inline void read(int &x)
{
x = ;char ch = getchar(), c = ch;
while(ch < '' || ch > '') c = ch, ch = getchar();
while(ch <= '' && ch >= '') x = x * + ch - '', ch = getchar();
if(c == '-') x = -x;
}
const int INF = 0x3f3f3f3f;
const int MAXN = + ;
const int MAXM = + ;
int size[MAXM * MAXN], s[MAXM * MAXN], t[MAXM * MAXN], n, m, ca;
int g[MAXN][MAXN * MAXM], n1, n2, sla[MAXN * MAXM], pre[MAXN * MAXM], vis[MAXN * MAXM], lab1[MAXN * MAXN], lab2[MAXN * MAXM], lk1[MAXN * MAXN], lk2[MAXN * MAXM];
void cal(int x)
{
memset(vis, , sizeof(vis)), memset(sla, 0x3f, sizeof(sla)), memset(pre, , sizeof(pre)), vis[] = ;
int y;
do
{
y = ;
for(int i = ;i <= n2;++ i)
{
if(vis[i]) continue;
if(lab1[x] + lab2[i] - g[x][i] < sla[i]) sla[i] = lab1[x] + lab2[i] - g[x][i], pre[i] = x;
if(sla[i] < sla[y]) y = i;
}
int d = sla[y];
for(int i = ;i <= n1;++ i) if(vis[lk1[i]]) lab1[i] -= d;
for(int i = ;i <= n2;++ i) if(vis[i]) lab2[i] += d; else sla[i] -= d;
vis[y] = ;
}while(x = lk2[y]);
for(;y;swap(y, lk1[lk2[y] = pre[y]]));
}
double KM()
{
for(int i = ;i <= n1;++ i) cal(i);
int ans = ;
for(int i = ;i <= n1;++ i) ans += g[i][lk1[i]];
return (double)-ans;
}
int tag[MAXN], from[MAXN], to[MAXN], stack[MAXN], tot;
int main()
{ while(scanf("%d %d\n", &m, &n) != EOF && n && m)
{
if(ca) putchar('\n');
memset(from, , sizeof(from)), memset(tag, , sizeof(tag)), memset(to, , sizeof(to)), memset(stack, , sizeof(stack)), n1 = n, n2 = n * m, ++ ca, memset(lab1, -0x3f, sizeof(lab1)), memset(lk1, , sizeof(lk1)), memset(lk2, , sizeof(lk2)), memset(g, -0x3f, sizeof(g)), memset(lab2, , sizeof(lab2));
for(int i = ;i <= m;++ i) read(size[i]);
for(int i = ;i <= n;++ i)//考虑每个程序
{
int k;read(k);
for(int j = ;j <= k;++ j) read(s[j]), read(t[j]);
s[k + ] = INF;
for(int j = ;j <= m;++ j)//在区域j中
for(int l = ;l <= k;++ l)
if(s[l] <= size[j] && size[j] < s[l + ])//运行时间为t[l]
for(int p = ;p <= n;++ p) //倒数第p个运行
g[i][(j - ) * n + p] = - p * t[l], lab1[i] = max(lab1[i], - p * t[l]);
}
printf("Case %d\nAverage turnaround time = %.2lf\n", ca, KM() / (double)n);
for(int i = ;i <= n;++ i) tag[i] = (lk1[i] - ) / n + ;
for(int i = ;i <= m;++ i)
{
tot = ;int sum = ;
for(int j = ;j <= n;++ j) if(tag[j] == i) stack[++ tot] = j;
for(;tot;-- tot)
from[stack[tot]] = sum, to[stack[tot]] = sum = sum + (-g[stack[tot]][lk1[stack[tot]]] / ((lk1[stack[tot]] - ) % n + ));
}
for(int i = ;i <= n;++ i) printf("Program %d runs in region %d from %d to %d\n", i, tag[i], from[i], to[i]);
}
return ;
}

LA2238

LA2238 Fixed Partition Memory Management的更多相关文章

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

    /** 题目: Fixed Partition Memory Management UVALive - 2238 链接:https://vjudge.net/problem/UVALive-2238 ...

  2. UVALive 2238 Fixed Partition Memory Management(二分完美匹配)

    题意:计算机中有一些固定大小的内存,内存越大,处理速度越快.对于一个程序,加入不同的内存空间,处理所需时间不同.现给出m个内存空间,n个程序,对于每个程序程序,有k组数据(s,t),分别表示当程序 i ...

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

    题意:目前有一部分可用内存,分为m个大小固定的区域.现有n个程序要执行,每个程序在不同大小的内存中运行所需的时间不同,要使运行完所有程序所耗时最少,问每个程序在哪块区域中从什么时间运行到什么时间,以及 ...

  4. Operating System Memory Management、Page Fault Exception、Cache Replacement Strategy Learning、LRU Algorithm

    目录 . 引言 . 页表 . 结构化内存管理 . 物理内存的管理 . SLAB分配器 . 处理器高速缓存和TLB控制 . 内存管理的概念 . 内存覆盖与内存交换 . 内存连续分配管理方式 . 内存非连 ...

  5. Lifetime-Based Memory Management for Distributed Data Processing Systems

    Lifetime-Based Memory Management for Distributed Data Processing Systems (Deca:Decompose and Analyze ...

  6. lwIP Memory Management

    http://lwip.wikia.com/wiki/Lwipopts.h Memory management (RAM usage) /** * MEM_LIBC_MALLOC==1: Use ma ...

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

    Objective -C Memory Management  内存管理  第一部分 Memory management is part of a more general problem in pr ...

  8. memory management in oracle 11G R2

    When we talking about memory management in Oracle, we are refering to SGA and PGA. The management me ...

  9. [译]C# 7系列,Part 10: Span<T> and universal memory management Span<T>和统一内存管理

    原文:https://blogs.msdn.microsoft.com/mazhou/2018/03/25/c-7-series-part-10-spant-and-universal-memory- ...

随机推荐

  1. Java学习之程序运行机制

    Java的运行机制是:先编译,后解释. 典型的编译型编程语言是:C和C++. eg:用c语言编写的*.c文件编译生成*.h文件,通过链接将*.h文件链接成*.exe文件,然后就可以运行,编译型的高级语 ...

  2. 06_mybatis关系映射

    1.数据库表分析 表与表之间的业务关系: ​ 在分析表与表之间的业务关系时需要建立 在某个业务意义基础上去分析; ​ 先分析数据级别之间有关系的表之间的业务关系; usre和orders: ​ use ...

  3. 初识OpenCV-Python - 008: 形态转换

    本节学习了图片的形态转换,即利用函数和图像的前景色和背景色去侵蚀或者扩张图像图形. import cv2import numpy as npfrom matplotlib import pyplot ...

  4. uoj#370【UR #17】滑稽树上滑稽果

    题目 低智选手果然刷不动uoj 首先考虑一下构造一棵树显然是骗你玩的,按位与这个东西越做越小,挂到链的最下面显然不会劣于挂到之前的某一个点下面,所以我们只需要求一个排列使得答案最小就好了 设\(A=\ ...

  5. object_detection/protos/*.proto: No such file or directory

    1 背景 使用TensorFlow Object Detection API的时,在object_detection/protos/中,可以看到一些proto 文件,需要使用protoc程序将这些pr ...

  6. google浏览器插件开发

    官方开发文档 随便找个文件夹新建插件所需文件 目录结构 pluginName manifest.json(必须)                          一个manifest文件 *.htm ...

  7. CSS - 定位相关

    定位 (position) 1. 相对定位 (relative) 相对于元素原来的位置进行移动 2. 绝对定位 (absolute) 如果父级元素中有相对定位属性, 则参照父级元素进行定位, 默认参照 ...

  8. Elasticsearch基本命令

    检查集群运行情况:    GET ->   localhost:9200/_cat/health?v 查看集群节点列表:    GET ->   localhost:9200/_cat?n ...

  9. webpack静态资源拷贝插件

    处理不需要使用webpack统一打包处理或webpack不支持的文件 安装 npm install copy-webpack-plugin --save-dev 配置 const copyWebpac ...

  10. 通过Amazon AWS 十分钟搭建私人主机 自由的不要不要的

      首先承认有点标题党了,当时自己搞的时候可不止十分钟,好吧,我承认是坑太多了,所以特意开了一篇博文,就是要准备尝试的和我一样的菜鸟们,可以真正的十分钟搞定.  当然高手可能用不上十分钟. 首先,就是 ...