UVa1006/LA2238 Fixed Partition Memory Management

UVa1006/LA2238 Fixed Partition Memory Management

  • 题目链接
  • 题意
    • 输入格式
    • 输出格式
  • 分析
  • AC 代码

题目链接

   本题是2001年icpc世界总决赛的G题

题意

   早期的多程序操作系统常把所有的可用内存划分成一些大小固定的区域,不同的区域一般大小不同,而所有区域的大小之和为可用内存的大小。给定一些程序,操作系统需要给每个程序分配一个区域,使得它们可以同时执行。可是每个程序的运行时间可能和它所占有的内存区域大小有关,因此调度并不容易。
   编程计算最优的内存分配策略,即给定m个区域的大小和n个程序在各种内存环境下的运行时间,找出一个调度方案,使得平均回转时间(即平均结束时刻)尽量小。具体来说,你需要给每个程序分配一个区域,使得没有两个程序在同一时间运行在同一个内存区域中,而所有程序分配的区域大小都不小于该程序的最低内存需求。程序对内存的需求不会超过最大内存块的大小。

输入格式

   输入包含多组数据。每组数据第一行为正整数m 和n,即区域的个数和程序的个数(1≤m≤10, 1≤n≤50)。下一行包含m个正整数,即各内存区域的大小。以下n行描述每个程序在各种内存大小中的执行时间,其中第一个整数为情况总数k(k≤10),然后是k对整数s1, t1, s2, t2, …, sk, tk,满足si<si+1。当内存不足s1 时程序无法运行;当内存大小s满足si≤s<si+1时运行时间为ti;如果内存至少为sk,运行时间为tk。输入结束标志为m=n=0。

输出格式

   对于每组数据,输出最小平均回转时间和调度方案。如果有多组解,任意输出一组即可。

分析

   这道题的建模极为经典!《训练指南》题解:

   先来看一个内存区域的情况。假设在这个内存区域按顺序执行的k 个程序的运行时间分别为t1, t2, t3, …, tk,那么第i个程序的回转时间为ri=t1+t2+…+ti,所有程序的回转时间之和等于r=kt1+(k-1)t2+(k-2)t3+…+2tk-1+tk。换句话说,如果程序i 是内存区域j的倒数第p个执行的程序,则它对于总回转时间的“贡献值”为pTi,j,其中Ti,j为程序i 在内存区域j中的运行时间。
   这样一来,算法就比较明显了。构造二分图G,X 结点为n个程序,Y结点为n×m个“位置”,其中位置(j,p)表示第j个内存区域的倒数第p个执行的程序。每个X结点i和Y结点(j,p)连有一条权为pTi,j的边,然后求最小权匹配即可。注意,并不是每个匹配都对应一个合法方案(比如,一个区域不能只有倒数第一个程序而没有倒数第二个程序),但最佳匹配一定对应一个合法方案(想一想,为什么)。

   下面就想一下这样做的正确性:
   题解采用了倒数第p个这样的设定,并且对应边权pTi,j中Ti,j一定是一个定值,那么自然是p越小越好。所以是先有了倒数第一才会有倒数第二,而不会只有倒数第一,没有倒数第二,又有倒数第三的不符合现实的情况(这在其他非最大权的二分图最大匹配有可能出现)。 二分图最大权(权其实取负了)匹配避免开了这种不符合现实的情况, 所以一定是一个合法方案。
    最后再提一点,二分图最大权匹配,并一定要通过加点将X点集和Y点集的数量凑成相同再求最佳完美匹配,不加点的做法参见AC代码。

AC 代码

#include <iostream>
#include <iomanip>
using namespace std;#define INF 1000000000
#define M 11
#define N 51
int x[N][3], mem[M], a[M], c[M], w[N][M][N], slack[M][N], lx[N], ly[M][N], p[M][N], m, n, kase = 0; bool s[N], t[M][N];bool match(int i) {s[i] = true;for (int j=1; j<=m; ++j) for (int k=1; k<=n; ++k) if (!t[j][k]) {int d = lx[i] + ly[j][k] - w[i][j][k];if (d == 0) {t[j][k] = true;if (!p[j][k] || match(p[j][k])) {p[j][k] = i;return true;}} else slack[j][k] = min(slack[j][k], d);}return false;
}void km() {for (int i=1; i<=n; ++i) lx[i] = -INF;for (int i=1; i<=m; ++i) for (int j=1; j<=n; ++j) p[i][j] = ly[i][j] = 0;for (int i=1; i<=n; ++i) for (int j=1; j<=m; ++j) for (int k=1; k<=n; ++k) lx[i] = max(lx[i], w[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] = INF;while (true) {for (int j=1; j<=n; ++j) s[j] = false;for (int j=1; j<=m; ++j) for (int k=1; k<=n; ++k) t[j][k] = false;if (match(i)) break;int a = INF;for (int j=1; j<=m; ++j) for (int k=1; k<=n; ++k) if (!t[j][k]) a = min(a, slack[j][k]);for (int j=1; j<=n; ++j) if (s[j]) lx[j] -= a;for (int j=1; j<=m; ++j) for (int k=1; k<=n; ++k) t[j][k] ? ly[j][k] += a : slack[j][k] -= a;}}
}void solve() {for (int i=1; i<=m; ++i) cin >> mem[i];for (int i=1; i<=n; ++i) {int k; cin >> k;for (int j=k; j>0; --j) cin >> a[j] >> c[j];for (int j=1, p; j<=m; ++j) {for (p=1; p<=k; ++p) if (mem[j] >= a[p]) {for (int k=1; k<=n; ++k) w[i][j][k] = -c[p]*k;break;}if (p > k) for (int k=1; k<=n; ++k) w[i][j][k] = -INF;}}km();int s = 0;for (int i=1; i<=n; ++i) s -= lx[i];for (int i=1; i<=m; ++i) for (int j=1; j<=n; ++j) s -= ly[i][j];for (int i=1, j; i<=m; ++i) if (p[i][1]) {for (int k=1; k<=n; ++k) if (p[i][k]) j = k;for (int k=j, t=0, y; k>0; --k) x[y = p[i][k]][0] = i, x[y][1] = t, x[y][2] = (t -= w[y][i][k]/k);}cout << "Case " << ++kase << endl << "Average turnaround time = " << s/double(n) << endl;for (int i=1; i<=n; ++i)cout << "Program " << i << " runs in region " << x[i][0] << " from " << x[i][1] << " to " << x[i][2] << endl;cout << endl;
}int main() {cout << fixed << setprecision(2);while (cin >> m >> n && m) solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/11767.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【cpp】并发多线程 Unique

1. unique_lock 何时锁定资源。 unique_lock lock1 时候&#xff0c;还没有锁住资源。 实际是后面&#xff0c;显式的出发&#xff1a; 比如&#xff0c; lock.lock, 或 std::lock(lk1,lk2), 或者条件变量CV.wait(mtx, []{!re})。 #include <iostream> #include <mu…

LVS + Keepalived 高可用群集

一、准备环境 主keepalived&#xff1a;172.168.1.11 lvs 备keepalived&#xff1a;172.168.1.12 lvs web1&#xff1a;172.168.1.13 web2&#xff1a;172.168.1.14 vip&#xff1a;172.168.1.100 客户机访问 关闭防火墙 二、配置 主keepalived 服务器 1. 安装…

[嵌入式系统-78]:RT-Thread:线程管理的基本原理与应用

目录 一、RTT线程的特点 二、RTT线程机制 2.1 线程的属性与线程控制块详解 2.2 线程的调度 2.3 线程的切换 2.5 系统线程 三、线程的调度机制 3.1 线程创建与删除 1、线程控制块 2、线程栈 3、入口函数 4、线程的创建方式 &#xff08;1&#xff09;静态线程初始化函…

【手势操作-复习前一天的内容-预习今天的内容 Objective-C语言】

一、昨天呢,我们学习的是这个,事件 1.事件这一块儿呢,iOS事件,分为三大类, 1)触摸事件 2)加速计事件 3)远程控制事件 2.这个里边呢,我们主要学习的是这个触摸事件,触摸事件里边,就是Touch,touchesBegan:方法里边,有一个touches参数,它是set类型的, 3.Set,…

nginx与php的通信方式

Nginx 和 PHP 之间的通信主要通过 FastCGI 协议进行&#xff0c;而FastCGI协议支持两种通信方式&#xff1a;Unix域套接字&#xff08;Unix Socket&#xff09;和TCP/IP网络套接字。下面是这两种通信方式的主要区别&#xff1a; Unix域套接字&#xff08;Unix Socket&#xff…

甲辰年四月初七思悟

甲辰年四月初七思悟 意懒青云天&#xff0c;情贪山水间。​ 为志凡尘炼&#xff0c;行路交际变。​ 日程分秒年&#xff0c;四时轮回现。 ​忧苦缘分面&#xff0c;嗔痴欲求践。

Redis:分布式系统

文章目录 认识RedisRedis和MySQLRedis的场景Redis的设计 分布式单机架构应用数据分离架构应用服务集群架构 认识Redis 在开始Redis学习前&#xff0c;要先认识一下Redis Redis的设计&#xff0c;是想要把它当做是一个数据库&#xff0c;一个缓存&#xff0c;或者说是一个消息…

C语言 | Leetcode C语言题解之第87题扰乱字符串

题目&#xff1a; 题解&#xff1a; struct HashTable {int key;int val;UT_hash_handle hh; };void modifyHashTable(struct HashTable** hashTable, int x, int inc) {struct HashTable* tmp;HASH_FIND_INT(*hashTable, &x, tmp);if (tmp NULL) {tmp malloc(sizeof(st…

Nginx - location中的匹配规则和动态Proxy

文章目录 官网location 规则详解动态Proxy使用多个 if 指令指定不同的 proxy_pass根据参数选择不同的 proxy_pass 官网 https://nginx.org/en/docs/http/ngx_http_core_module.html#location location 规则详解 Nginx的location指令工作原理如下&#xff1a; 位置匹配&#…

vs2019 c++ 对左值引用取地址得到的是谁的地址?

&#xff08;1&#xff09; 测试一下&#xff1a; 对左值引用取地址&#xff0c;返回的地址是其引用的变量的地址&#xff0c;而非自身的地址。 &#xff08;2&#xff09; 用反汇编看一下&#xff0c;为了代码容易看懂&#xff0c;改一下源代码&#xff0c;不使用 cout 这个复…

【格式控制】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 从键盘输入一批数值&#xff0c;要求保留3位小数&#xff0c;在输出时上下行小数点对齐。 源码 #include <iostream>using namespace std;int main(void) {double a, b, c;cout << "请输入三个实数&#xff0c;中间用空格…

iOS 数据库升级

使用FMDB结合FMDBMigrationManager&#xff08;一个三方库&#xff09;的方式 1、首先自定义一个sql语句的类 #import#import"FMDBMigrationManager.h" interfaceMigration:NSObject (instancetype)initWithName:(NSString*)name andVersion:(uint64_t)version a…

阿里云OSS配置跨域及域名访问

1、配置跨域 进入对象存储OSS–>OSS存储桶–>数据安全–>跨域设置–>创建规则 2、配置跨域 Etag x-oss-request-id3、配置结果如下 4、数据源配置 切换到数据管理–>静态页面 配置根页面 保存结果如下 5、配置域名访问 绑定域名 添加txt记录 验证绑定 …

Unity 滚动视图(ScrollRect)使某个元素在可视范围内(滚动到某个元素)

在使用UGUI制作滚动视图的过程中&#xff0c;可能会遇到需求说&#xff0c;要定位到其中的某个元素&#xff0c;把它显示在Viewport可视范围内&#xff0c;这要怎么做呢&#xff1f;话不多说&#xff0c;上代码&#xff1a; namespace ZetanStudio.Extension {public static c…

git仓库使用

git仓库是会限制空间大小限制的 git网络库的容量限制_github仓库大小限制-CSDN博客 git是用于管理github的工具 电脑左下角搜索git打开GitBash.exe 进入到要下载到本地的目录 下载到本地的文件不要更改&#xff01; 如果要使用请务必把文件复制到别的空间去再在这个别的空间…

spring_Mybatis模板

maven依赖&#xff1a; <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.20</version></dependency><dependency><groupId>mysql…

论文阅读记录--关于水文系统的传递函数

文章目录 J-schuite的文章,地下水系统的响应的功率谱分析--传递函数1. 什么是冲激响应函数与传递函数?2. 地下水流系统中传递函数的求解3. J-schuite文章中传递函数的复现J-schuite的文章,地下水系统的响应的功率谱分析–传递函数 1. 什么是冲激响应函数与传递函数? 在信号…

记录:卡尔曼滤波推导

参考&#xff1a;古月居-卡尔曼滤波 一、高斯分布&#xff08;Gaussian Distribution&#xff09; 一维高斯分布&#xff1a;随机变量 X X X服从数学期望 μ \mu μ、方差 σ 2 \sigma^2 σ2的正态分布&#xff0c;概率密度函数为 p ( x ) p(x) p(x)。 X ∼ N ( μ , σ 2 )…

前言:为什么学习鸿蒙设备开发

HarmonyOS 是什么&#xff1f;众所周知&#xff0c;HarmonyOS 鸿蒙操作系统是由华为研发的一款面向未来、面向全场景的分布式操作系统&#xff0c;它旨在为各种设备提供统一的操作系统解决方案&#xff0c;从智能手机、平板电脑到智能穿戴设备、智能家居、汽车等各类终端设备都…

Go语言数值类型教程

Go语言提供了丰富的数值类型&#xff0c;包括整数类型、浮点类型和复数类型。每种类型都有其特定的用途和存储范围。下面将详细介绍这些类型&#xff0c;并附带示例代码。 原文链接&#xff1a; Go语言数值类型教程 - 红客网-网络安全与渗透技术 1. 整数类型 原文链接&#xf…