UVA 690 Pipeline Scheduling
https://vjudge.net/problem/UVA-690
题目
你有一台包含5个工作单元的计算机,还有10个完全相同的程序需要执行。每个程序需要$n(n<20)$个时间片来执行,可以用一个5行n列的保留表(reservation table)来表示,其中每行代表一个工作单元(unit0~unit4),每列代表一个时间片,行i列j的字符为X表示“在程序执行的第j个时间片中需要工作单元i”。例如,如图所示就是一张保留表,其中程序在执行的第0,1,2,……个时间片中分别需要unit0,unit1,unit2……
同一个工作单元不能同时执行多个程序,因此若两个程序分别从时间片0和1开始执行,则在时间片5时会发生冲突(两个程序都想使用unit0),如图所示。
输入一个5行n(n<20)列的保留表,输出所有10个程序执行完毕所需的最少时间,例如,对于图中的保留表,执行完10个程序最少需要34个时间片。
| clock | 0 | 1 | 2 | 3 | 4 | 5 | 6 | clock | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
| unit0 | X | . | . | . | X | X | . | unit0 | 0 | 1 | . | . | 0 | C | 1 | . | |
| unit1 | . | X | . | . | . | . | . | unit1 | . | 0 | 1 | . | . | . | . | . | |
| unit2 | . | . | X | . | . | . | . | unit2 | . | . | 0 | 1 | . | . | . | . | |
| unit3 | . | . | . | X | . | . | . | unit3 | . | . | . | 0 | 1 | . | . | . | |
| unit4 | . | . | . | . | . | . | X | unit4 | . | . | . | . | . | . | 0 | 1 |
题解
我是真的服了这题了……还有昨天每次评测都要排半小时的队……
1.直接模拟,加上剪枝:如果剩余的程序全部使用最短移动仍然超过了当前最短的时间,那么就剪枝。提前计算移动的步数。但是这个方法容易TLE……
2.使用二进制压缩状态,加上剪枝

每次移动只需要判断原来的状态向后移与程序的保留表是否有冲突,如果没有,将这两个取并作为新的状态。
AC代码
#include<bits/stdc++.h>
using namespace std;
#define REP(r,x,y) for(register int r=(x); r<(y); r++)
#define REPE(r,x,y) for(register int r=(x); r<=(y); r++)
#define MAXN 17
#ifdef sahdsg
#define DBG(...) printf(__VA_ARGS__)
#else
#define DBG(...)
#endif
int n;
int maxd; int ans;
int tmp[5];
int can[450],cani=0;
void dfs(int d, int x, int pos, const int* lp) {
if(pos+(9-d)*can[0]+n>=ans) { return;}
REP(i,0,5) {
if(tmp[i] & (lp[i]>>x)) return;
}
int np[5]; memcpy(np,lp,sizeof np); REP(i,0,5) {
np[i] = tmp[i] | (np[i]>>x);
} if(d==9) {
// assert(false);
ans = min(ans,pos+n);
} else {
REP(i,0,cani) {
dfs(d+1,can[i], pos+can[i],np);
}
} }
int main() {
#ifdef sahdsg
freopen("in.txt", "r", stdin);
#endif
while(~scanf("%d", &n) && n) {
// memset(vis,0,sizeof vis);
// memset(pic,0,sizeof pic);
maxd=-1;
cani=0;
memset(tmp,0,sizeof tmp);
REP(i,0,5) REP(j,0,n) {
char ch=getchar();
while(ch<' ') ch=getchar();
if(ch=='X') {
// pic[i][j]=1;
maxd=max(maxd,j);
tmp[i]|=1<<j;
}
}
REPE(d,1,maxd+1) {
REP(i,0,5){
if(tmp[i] & (tmp[i]>>d)) goto nxt;
}
can[cani++]=d;
nxt:;
}
if(maxd==-1) assert(false);
else {
ans=9*(maxd+1)+n;
REP(i,0,cani) {
dfs(1,can[i], can[i],tmp);
}
}
printf("%d\n", ans);
}
return 0;
}
UVA 690 Pipeline Scheduling的更多相关文章
- 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem
UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...
- UVA 1380 A Scheduling Problem
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 690 PipelineScheduling 位运算+dfs+剪枝
一开始最容易想到间隔最多为n,但是结点还是太多了,需要优化. 预处理:预判一下并保存下一个可以放的位置距离之前的距离.这样可以减少很多判断. 最优化剪枝:如果当前长度+剩下没放的程序*最短间隔如果大于 ...
- 【习题 7-5 UVA-690】Pipeline Scheduling
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 一定在这里写完思路再敲代码!!! 处理出5个工作单元在哪些时刻会被用到. ->设为initstatu 因为每次都会面临之前已经 ...
- UVA 607 二十二 Scheduling Lectures
Scheduling Lectures Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submi ...
- 【UVA 1380】 A Scheduling Problem (树形DP)
A Scheduling Problem Description There is a set of jobs, say x1, x2,..., xn <tex2html_verbatim_ ...
- 递推DP UVA 607 Scheduling Lectures
题目传送门 题意:教授给学生上课,有n个主题,每个主题有ti时间,上课有两个限制:1. 每个主题只能在一节课内讲完,不能分开在多节课:2. 必须按主题顺序讲,不能打乱.一节课L时间,如果提前下课了,按 ...
- A trip through the Graphics Pipeline 2011_13 Compute Shaders, UAV, atomic, structured buffer
Welcome back to what’s going to be the last “official” part of this series – I’ll do more GPU-relate ...
- A trip through the Graphics Pipeline 2011_01
It’s been awhile since I posted something here, and I figured I might use this spot to explain some ...
随机推荐
- 记一次InputStream引起的乱码
项目上线一周后,正准备看新闻的我突然接到了一个任务.线上突然出现了一条乱码的数据,需要解决这个bug.于是我放下了手中的保温杯,开始解决这个bug.经过一番折腾,发现是有一个同事在处理IO流上写得有点 ...
- 《Python从菜鸟到高手》已经出版,开始连载了,购买送视频课程
好消息,<Python从菜鸟到高手>已经出版!!! JetBrains官方推荐图书!JetBrains官大中华区市场部经理赵磊作序!送2400分钟同步视频课程!500个案例,400道P ...
- 【LeetCode-数组篇】 1 Two Sum
1 前言 之所以开始刷 LeetCode 上的算法题,一是快面临秋招,第二点是因为提升自己的编程能力,坚持两个月,希望博友们监督. 这个系列打算用 C# 和 Java 编程,为什么用两门语言,因为经历 ...
- Python Revisited Day 04 (控制结构与函数)
目录 4.1 控制结构 4.1.1 条件分支 4.1.2 循环 4.2 异常处理 4.2.1 捕获与产生异常 4.2.2 自定义异常 4.3 自定义函数 Tips 参数默认值为可变时 危险 4.3.1 ...
- STL queue用法
先进先出 #include<iostream> #include<algorithm> #include<cstdio> #include<stack> ...
- 【评分】BETA 版冲刺前准备
[评分]BETA 版冲刺前准备 总结 本次作业较为简洁,计1分,按时提交计分,不提交不计分. 详细得分 组 短学号 名 分数 Boy Next Door 114 显东 1 Boy Next Door ...
- sql中return和returns的区别
用户定义函数中,用RETURNS 子句指定该函数返回值的数据类型 return用于返回具体的值/值变量
- Git远程分支的回退
下午发现上午提交的一个版本有问题,在回退本地分支后,发现还必须要回退远程分支的版本.网上查找到的资料如下: #新建old_master分支做备份 git branch old_master #push ...
- Python_计算文件夹大小
计算文件夹大小 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.path.join(path1[, path2[, ...]]) 将 ...
- xmanager 乱码
xmanager连接后中文显示乱码 - 程序员CC - 博客园http://www.cnblogs.com/aomidata/p/3445075.html Xshell 为什么会出现中文乱码?-Xma ...