并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)
任务介绍
你的任务是模拟n个程序的并行运算。(按照输入编号为1~n)的并行执行。
代码实现
#define LOCAL
#include<bits/stdc++.h>
using namespace std;
int main(){
#ifdef LOCAL
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
#endif // LOCAL
int n,t[5],Q;
scanf("%d%d%d%d%d%d%d",&n,&t[0],&t[1],&t[2],&t[3],&t[4],&Q);
unordered_map<char,int>variable;//变量与其值的映射关系
deque<int>block,wait;//阻塞队列、等待队列
bool lock=false;//锁
vector<deque<string>>program(n+1);//每个程序
for(int i=1;i<=n;++i){//读取每个程序代码
wait.push_back(i);//。初始等待队列包含按输入顺序排列的各个程序
string line;
while(getline(cin,line)&&line!="end")
program[i].push_back(line);
program[i].push_back("end");
}
while(!wait.empty()){//等待队列不空就继续循环
int cur=wait.front();//读取当前运行的程序
wait.pop_front();
if(program[cur].empty())//当前程序已运行完毕,不再执行任何操作
continue;
wait.push_back(cur);//将当前运行的程序插入到等待队列末尾
for(int time=0;time<Q;){//当前程序运行时间小于配额时继续执行
string s=program[cur].front();//读取需要执行的指令
program[cur].pop_front();//弹出队首指令
if(s[2]=='='){//是赋值指令
variable[s[0]]=stoi(s.substr(4));//更新或插入变量及其对应值
time+=t[0];//更新当前程序运行时间
}else if(s[2]=='i'){//是print指令
printf("%d: %d\n",cur,variable[s[6]]);//打印
time+=t[1];//更新当前程序运行时间
}else if(s[2]=='c'){//是lock指令
if(lock){//已经上锁了
program[cur].push_front(s);//当前指令重新压回队首
block.push_back(cur);//当前程序插入到阻塞队列队尾
wait.pop_back();//将当前程序从等待队列末尾中删除
break;//不再执行其他指令
}//没有上锁过
lock=true;//上锁
time+=t[2];//更新当前程序运行时间
}else if(s[2]=='l'){//unlock指令
lock=false;//解除上锁
time+=t[3];//更新当前程序运行时间
if(!block.empty()){//阻塞队列不空
wait.push_front(block.front());//将阻塞队列队首程序插入到等待队列队首
block.pop_front();//弹出阻塞队列队首程序
}
}else if(s[2]=='d')//end指令
break;//直接跳出循环
}
}
return 0;
}
并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)的更多相关文章
- UVa210 Concurrency Simulator (ACM/ICPC World Finals 1991) 双端队列
Programs executed concurrently on a uniprocessor system appear to be executed at the same time, but ...
- [算法竞赛入门经典]Message Decoding,ACM/ICPC World Finals 1991,UVa213
Description Some message encoding schemes require that an encoded message be sent in two parts. The ...
- uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...
- ACM - ICPC World Finals 2013 C Surely You Congest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...
- HDU 5873 Football Games 【模拟】 (2016 ACM/ICPC Asia Regional Dalian Online)
Football Games Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)To ...
- 6-1 并行程序模拟 uva210
用到了 deque 和queue 操作说明: queue qu: qu.push(x); int d=qu.front(); qu.pop(); 和栈一样只有push和pop ...
- UVa 210 并行程序模拟(deque)
题意: 模拟n个程序运行 格式一共有5种:var = constant(赋值):print var(打印):lock:unlock:end, 上述5种语句分别需要t1.t2.t3.t4.t5单位时间 ...
- ACM - ICPC World Finals 2013 A Self-Assembly
原题下载 : http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这道题其实是2013年我AC的第一道题,非常的开心,这 ...
- ACM - ICPC World Finals 2013 B Hey, Better Bettor
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 这题真心的麻烦……程序不长但是推导过程比较复杂,不太好想 ...
随机推荐
- PL/SQL添加Oracle对象
1.首先用system的身份进入数据库 2.找到user文件夹 3.右击新建用户 在“创建用户”窗口中,输入新用户的名称.口令,默认表空间.临时表空间等 4.赋予新用户权限,赋予其角色权限:conne ...
- 每日笔记---使用@ConfigurationProperties读取yml配置
每日笔记---使用@ConfigurationProperties读取yml配置 参考地址 https://www.cnblogs.com/mycs-home/p/8352140.html 1.添加 ...
- 【oracle使用笔记1】SQL报的常见错误
项目中使用最多的就是oracle数据库了,在实际的开发中书写SQL时遇到过许多错误,趁着现在不太忙,把之前遇到的总结一下,以后遇到的会持续更新总结. 1. ORA-00001:违反唯一约束条件 [原因 ...
- Swift_错误处理
Swift_错误处理 点击查看源码 //错误处理 func test() { //错误枚举 需ErrorType协议 enum ErrorEnum: Error { case `default` // ...
- ios常用数据库、完美无缺
直接copy过去就能用,我们不用再去造轮子,现在的xocod9.4更加人性化了,不用再添加依赖库,这点苹果你让我开始喜欢了,哈哈. 需要这兄弟拉进去的哈 下班标的1,2,3,4就是就截图的4个文件,没 ...
- 更新UI放在主线程的原因
1.在子线程中是不能进行UI 更新的,而可以立刻更新的原因是:子线程代码执行完毕了,又自动进入到了主线程,这中间的时间非常的短,让我们误以为子线程可以更新UI.如果子线程一直在运行,则无法更新UI,因 ...
- springboot的junit4模拟request、response对象
关键字: MockHttpRequest.Mock测试 问题: 在模拟junit的request.response对象时,会报如下空指针异常. 处理方法: 可用MockHttpServletReque ...
- mongodb C++ Driver安装
前言 mongocxx官网地址 http://mongocxx.org/?jmp=docs 本文的安装版本是:mongocxx-r3.2.0.tar.gz . 参考文档安装过程http://mongo ...
- mysql 导出行数据到txt文件,指定字符分割
select id,name, concat('tel:',phone) from user order by time INTO outfile 'user.txt' FIELDS terminat ...
- CAT 安装运行配置教程
CAT安装教程 首先安装mysql数据库,具体步骤参阅<mysql免安装教程>--http://www.cnblogs.com/halberts/p/8723938.html 下载CAT代 ...