uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN:
https://blog.csdn.net/su_cicada/article/details/87898579
例题6-1 并行程序模拟( Concurrency Simulator, ACM/ICPC World Finals 1991,
UVa210)
你的任务是模拟n个程序( 按输入顺序编号为1~ n) 的并行执行。 每个程序包含不超过
25条语句, 格式一共有5种: var = constant( 赋值) ; print var( 打印) ; lock; unlock; end。
变量用单个小写字母表示, 初始为0, 为所有程序公有( 因此在一个程序里对某个变量
赋值可能会影响另一个程序) 。 常数是小于100的非负整数。
每个时刻只能有一个程序处于运行态, 其他程序均处于等待态。 上述5种语句分别需
要t1、 t2、 t3、 t4、 t5单位时间。 运行态的程序每次最多运行Q个单位时间( 称为配额) 。 当
一个程序的配额用完之后, 把当前语句( 如果存在) 执行完之后该程序会被插入一个等待队
列中, 然后处理器从队首取出一个程序继续执行。 初始等待队列包含按输入顺序排列的各个
程序, 但由于lock/unlock语句的出现, 这个顺序可能会改变。
lock的作用是申请对所有变量的独占访问。 lock和unlock总是成对出现, 并且不会嵌套。
lock总是在unlock的前面。 当一个程序成功执行完lock指令之后, 其他程序一旦试图执行lock
指令, 就会马上被放到一个所谓的阻止队列的尾部( 没有用完的配额就浪费了) 。 当unlock
执行完毕后, 阻止队列的第一个程序进入等待队列的首部。
输入n, t1, t2, t3, t4, t5, Q以及n个程序, 按照时间顺序输出所有print语句的程序编号和结
果。
// 当前程序执行完,配额时间有剩余: 让下一个程序继续用
// 当配额时间用完,当前程序一句代码没执行完: 继续执行到完
就按照题目思路往下写出来的,但是我不知道为什么我写了这么多行。不想缩减了,
#include<iostream>
#include<vector>
#include<string>
#include<deque>
#include<map>
#include<cstdio>
using namespace std;
// 当前程序执行完,配额时间有剩余: 让下一个程序继续用
// 当配额时间用完,当前程序一句代码没执行完: 继续执行到完
// 多组输入
// 每组输出之间空一行
// 所有变量初值为0
// 最后一组的输出之后不要有空行
map<char, int> vars;
vector<deque<string> > group;
deque<int> stop;
deque<int> wait;
void fun(){
int N,t1,t2,t3,t4,t5,Q;
cin>>N>>t1>>t2>>t3>>t4>>t5>>Q;
cin.get(); // [注意] 接收空格
group = vector<deque<string> >(N);
for(int i=0;i<N;i++){
string str;
while(str != "end"){
getline(cin, str);
group[i].push_back(str);
}
wait.push_back(i);
}
int index = 0; //当前第几个程序
int count_live = N;
int lock = 0; // 作为临界资源的记录型信号量,代表阻塞程序个数
int part_time = 0; // 单位剩余时间
while(count_live){
int end_flag = 0; // 0:程序没结束, 1:程序end结束 -1:程序阻塞
index = wait[0]; // 读取等待队列首
wait.pop_front();
part_time = Q;
while(part_time>0){ // 一个单位时间剩余的时间
string code = group[index][0]; // 读取程序队列首代码
string judge = code.substr(0,2);
if(judge == "pr"){ // print
cout<<index+1<<": "<< vars[code[6]]<<endl;
part_time -= t2;
}else if(judge == "lo"){ // lock
if(lock){ // 要阻塞,语句不执行,不记时
stop.push_back(index);
end_flag = -1;
part_time = 0; // 此次时间片废了
break; // 进入阻止队列,就不用进入等待队列了, 而且lock代码还需要执行
}else{ // 正常执行
lock++;
part_time -= t3;
}
}else if(judge == "un"){ // unlock
int pro = stop[0];
if(!stop.empty()){ // 若是最后一个解锁的,那么阻塞队列就是空
stop.pop_front();
wait.push_front(pro);
}
lock--;
part_time -= t4;
}else if(judge == "en"){ // end
count_live --;
part_time -= t5;
end_flag = 1;
break; // 结束本程序,时间片给下一个
}else{ // var
int n;
sscanf(code.substr(4).c_str(), "%d",&n);
vars[judge[0]] = n;
part_time -= t1;
}
group[index].pop_front(); // 执行成功,代码出队列
}
if(end_flag == 0)
wait.push_back(index); // 时间片完,只要程序没有end, 就会入wait队列
}
}
int main()
{
int T;
cin>>T;
for(int i=0;i<T;i++){
if(i>0)
cout<<endl;
vars.clear();
group.clear();
stop.clear();
wait.clear();
fun();
}
return 0;
}
// AC at 2019/2/8 00:25
// spend about 4 hours
uva 210 - Concurrency Simulator (并行程序模拟)的更多相关文章
- UVa 210 Concurrency Simulator (双端队列+模拟)
题意:给定n个程序,每种程序有五种操作,分别为 var = constant(赋值),print var (打印), lock, unlock,end. 变量用小写字母表示,初始化为0,为程序所公有( ...
- 210 - Concurrency Simulator(WF1991, deque, 模拟)
题目有点长,理解题花了不少时间 粘下别人的翻译~ 你的任务是模拟n个程序(按输入顺序编号为1~n)的并行执行.每个程序包含不超过25条语句,格式一共有5种: var=constant(赋值): pri ...
- Uva - 210 - Concurrency Simulator
自己写个双端队列,或者直接用deque,这个也比较好用 AC代码: #include <iostream> #include <cstdio> #include <cst ...
- 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)
任务介绍 你的任务是模拟n个程序的并行运算.(按照输入编号为1~n)的并行执行. 代码实现 #define LOCAL #include<bits/stdc++.h> using name ...
- UVa 210 并行程序模拟(deque)
题意: 模拟n个程序运行 格式一共有5种:var = constant(赋值):print var(打印):lock:unlock:end, 上述5种语句分别需要t1.t2.t3.t4.t5单位时间 ...
- 6-1 并行程序模拟 uva210
用到了 deque 和queue 操作说明: queue qu: qu.push(x); int d=qu.front(); qu.pop(); 和栈一样只有push和pop ...
- 并发(Concurrency)和并行(Parallelism)的区别
最近在读<real world haskell>里关于并行的一章时,看到作者首先对并发(Concurrency)和并行(Parallelism)的区别进行了定义和解释.以前我对这个问题也是 ...
- 快速掌握用python写并行程序
目录 一.大数据时代的现状 二.面对挑战的方法 2.1 并行计算 2.2 改用GPU处理计算密集型程序 3.3 分布式计算 三.用python写并行程序 3.1 进程与线程 3.2 全局解释器锁GIL ...
- 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计
基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...
随机推荐
- Java学习---MD5加密算法
前言 在我们日常的程序开发中,或多或少会遇到一些加密/解密的场景,比如在一些接口调用的过程中,我们(Client)不仅仅需要传递给接口服务(Server)必要的业务参数,还得提供Signature(数 ...
- SQL查询含有%号的字段
select * from EMS_ANNOUNCEMENT where 1=1 and title like '%\%%' escape '\'
- web自动化_浏览器驱动chromedriver安装方法(适用RF框架/Selenium/Appium)
在进行UI自动化时,打开浏览器是第一步,这就必须要安装浏览器的驱动,chrome浏览器需要安装chromedriver,下载地址:http://chromedriver.storage.googlea ...
- 有关js弹出提示框几种方法
1直接提示只有确定功能的提示框 只显示提示信息 alert(“提示信息”); alert ();的参数只有一个就是提示信息,无返回值 2 弹出输入框让你输入内容 prompt() ; 有两个参数:第一 ...
- OpenStack高可用方案及配置
1 OpenStack高可用介绍 1.1 无状态和有状态服务 无状态服务指的是该服务接收的请求前后之间没有相关关系,接收并处理完该请求后不保存任何状态,在OpenStack的服务中常见的无状态服务 ...
- Why Reactive(Cocoa)?-时间线、输入、输出、复杂性、异步、状态、聚合
To put it another way, the output at any one time is the result of combining all inputs. The output ...
- BZOJ1861:[ZJOI2006]书架(Splay)
Description 小T有一个很大的书柜.这个书柜的构造有些独特,即书柜里的书是从上至下堆放成一列.她用1到n的正整数给每本书都编了号. 小T在看书的时候,每次取出一本书,看完后放回书柜然后再拿下 ...
- 「CF1025D Recovering BST」
题目 郑州讲过的题了 发现这是一个二叉搜索树,给出的还是中序遍历,我们很自然的想到我们需要可以用一个\(f[i][j][k](k\in[i,j])\)来表示区间\([i,j]\)能不能形成以\(k\) ...
- nordic对苹果性能测试
环境: app采用nrf connect或lightblue均可: nordic从端采用nrf52840开发板pca10056: 说明与规定: (1)鉴于手机app无法主动连续快速发送多包数据,故只测 ...
- CF284A Cows and Primitive Roots
嘟嘟嘟 这道题就是求一个奇素数\(p\)的原根数量. 公式是\(\varphi(\varphi(p))\).又因为\(p\)是质数,所以就是\(\varphi(p - 1)\). (证明啥的我不会-- ...