题意:给出5个工作单元,有10个完全相同的程序需要执行,工作单元要避免冲突,问所有程序执行完所需的时间最短是多少?

例:

7
X...XX.
.X.....
..X....
...X...
......X

7代表时间片,每个工作单元调用次数不固定,工作单元不能冲突,此数据最短时间为34。

分析:

这个只能是暴力求解,但是容易超时,我的想法就是每次枚举它的偏移量,判断是否冲突,加上剪枝。但是超时,就算是初始化所有可能偏移量加上预期剪枝还是超时,测试数据是真的强。

超时代码如下:

#include<iostream>
#include<string>
#include<string.h>
#include<queue>
#include<vector>
#include<list>
#include<set>
#include<sstream>
#include<algorithm>
#include<iomanip>
using namespace std;
const int maxn = 200 + 10;
int mp[maxn],n,maxt=20000;
int tp[maxn][20+5];
int ttemp[20 + 5];
int a[maxn];
int cnt = 0, diffarray[maxn];
bool isok(int k) {for (int i = 0; i < 5; i++) {if (a[i] & (a[i] >> k))return false;}return true;
}
void dfs(int layer, int diff) {if (layer == 10) {maxt = min(diff + n, maxt);return;}if (diff+(10-layer)*diffarray[0] >= maxt)return;//预期判断for (int k = 0 ;k<cnt; k++) {//枚举所有偏移量memset(ttemp, 0, sizeof(ttemp));int j = diff + diffarray[k];int ok = 1;for (int z = j; z < j + n; z++) {if (tp[z][mp[z - j]] == 1) {ok = 0;break;}}if (ok) {for (int z = j; z < j + n; z++) {tp[z][mp[z - j]] = 1;ttemp[z - j] = mp[z - j];}//memcpy(ttemp, mp, sizeof(mp));dfs(layer+1, j + 1);for (int i = 0; i < n; i++) {tp[j + i][ttemp[i]] = 0;}}}
}
int main() {char x;while (cin >> n && n) {int k = 1; maxt = 200000;memset(mp, 0, sizeof(mp));memset(tp, 0, sizeof(tp));memset(diffarray, 0, sizeof(diffarray));cnt = 0;for (int i = 0; i < 5; i++) {for (int j = 0; j < n; j++) {cin >> x;if (x == 'X') {mp[j] = i;tp[j][i] = 1;a[i] = 1 << j;//用二进制模拟}}}for (int i = 1; i <= n; i++) {if (isok(i))diffarray[cnt++] = i;//保存所有可能的偏移量}dfs(1, 1);cout << maxt-1<< endl;}return 0;
}

看了大佬的二进制模拟,真是巧妙,想不到,我用数组一个一个判断工作单元是否冲突,人家用二进制直接判断程序之间的所有工作单元是否冲突。

二进制模拟:

#include <cstdio>
#include <cstring>
#include<iostream>
#include <algorithm>
using namespace std;const int maxn = 25;
int n, a[5], dt[maxn], ans, cnt;bool ok(int *p, int k) {for (int i = 0; i < 5; ++i)if (a[i] & (p[i] >> k)) return false;return true;
}void dfs(int *p, int d, int sum) {if (sum + dt[0] * (10 - d) >= ans) return;if (d == 10) { ans = min(ans, sum); return; }for (int i = 0; i < cnt; ++i) {if (ok(p, dt[i])) {//直接判断当前程序的所有工作单元和已经被占用的工作单元是否冲突int p2[5];for (int j = 0; j < 5; ++j)p2[j] = (p[j] >> dt[i]) | a[j];//时间片前进,所有单元后移,没有冲突,加上新单元dfs(p2, d + 1, sum + dt[i]);}}return;
}int main() {while (cin>>n&&n) {memset(a, 0, sizeof(a));memset(dt, 0, sizeof(dt));char x;for (int i = 0; i < 5; i++) {for (int j = 0; j < n; j++) {cin >> x;if (x == 'X')a[i] |= (1 << j);//存入位置量}}cnt = 0;for (int i = 1; i <= n; ++i)if (ok(a, i)) dt[cnt++] = i;//找到所有可能偏移量ans = 10 * n;dfs(a, 1, n);cout << ans << endl;}return 0;
}

UVA690 Pipeline Scheduling 流水线调度相关推荐

  1. Jenkins Pipeline构建流水线发布

    Jenkins Pipeline构建流水线发布 1. Jenkins Pipeline 核心概念 Jenkins Pipeline是一套插件,支持在Jenkins中实现持续集成.交付管道; Pipel ...

  2. Jenkins + Pipeline 构建流水线发布

      Jenkins + Pipeline 构建流水线发布 利用Jenkins的Pipeline配置发布流水线 参考: https://jenkins.io/doc/pipeline/tour/depl ...

  3. Beam概念学习系列之Pipeline 数据处理流水线

    不多说,直接上干货! Pipeline 数据处理流水线 Pipeline将Source PCollection ParDo.Sink组织在一起形成了一个完整的数据处理的过程. Beam概念学习系列之P ...

  4. 经典问题:流水线调度(51nod)

    1205 流水线调度 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 N个作业{1,2,-,n}要在由2台机器M1和M2组成的流水线上完成加工.每个 ...

  5. 冲突向量求流水线调度策咯

    一.实验内容 1.根据流水线的时间周期和功能段数,输入流水线的预约表: 2.求出延迟禁止表和冲突向量: 3.构造流水线状态转移图: 4.寻找最小等间隔调度: 5.寻找最佳调度,并给出最小平均延迟和流水 ...

  6. 计算机系统结构——非线性流水线调度

    非线性流水线调度 回顾:线性流水线的调度 非线性流水线因为段间设置有反馈回路,一个任务在流水的全过程中,可能会多次通过同一段或越过某些段.这样,如果每拍向流水线送入一个新的任务,将会发生多个任务争用同 ...

  7. Jenkins之Pipeline代码流水线

    Pipeline翻译过来就是流水线的意思,在公司中可能会有很多项目,如果使用Jenkins构建完成后,开发构建项目需要一项一项点击,比较麻烦,因此,pipeline就应用而生了 . 一.部署Pipel ...

  8. 操作系统复习笔记 06 CPU Scheduling CPU调度

    CPU的三级调度: 1.高级调度(Long-term):作业调度,从外存进内存 2.低级调度(Short-term):进程调度,分配处理机 3.中级调度(Medium-term):对换 通过多道程序设 ...

  9. 华为OD机试题:工厂流水线调度

    题目描述: 一个工厂有m条流水线,来并行完成n个独立的作业,该工厂设置了一个调度系统,在安排作业时,总是优先执行处理时间最短的作业. 现给定流水线个数m,需要完成的作业数n, 每个作业的处理时间分别为 ...

最新文章

  1. JavaScript判断浏览器类型及版本
  2. C#-CHTTPDownload
  3. 应用Mongoose开发MongoDB(2)模型(models)
  4. JIRA6.3.6中设置用户的解决问题和关闭问题权限
  5. Google Tensorflow Webset
  6. c语言随机数表,C语言随机数
  7. 可信开发技术专家---阿里云诚聘
  8. 移动网速测试软件,网速测试大师APP
  9. 通州区机器人比赛活动总结_机器人科技活动总结.doc
  10. 汇总|医学图像分析领域论文
  11. antDesign Drawer
  12. 用python画人物素描_python实现图片素描效果
  13. 计算机游戏动漫制作自我鉴定,关于游戏实习的自我鉴定
  14. ps无缝拼图教程一:无缝拼接花纹图案
  15. scrapy写爬虫的心得
  16. Web3j使用教程(1)
  17. day01在线教育行业介绍(01)
  18. 好用的工具推荐一下js美化代码
  19. 谁的php最厉害,羽坛四大天王谁最强?羽毛球四大天王排行榜(图)
  20. 关于matlab的简介,Matlab 简介

热门文章

  1. RabbitMQ单个发布确认
  2. java分布式应用限流实现
  3. zipkin server 数据持久化问题
  4. Single System Image的理解
  5. 收不回来的value
  6. 工厂方法源码解析(jdk+logback)
  7. 机器人彩铅画_彩铅画嗔
  8. 气体润滑轴承matlab分析,气体润滑轴承的研究与发展
  9. mysql 光标的作用_Mysql那些事儿之(十四)光标的使用_MySQL
  10. koa2 mysql增删改查_react+koa2+mysql零门槛的全栈体验,附上完整项目分享