并行程序模拟(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 这题真心的麻烦……程序不长但是推导过程比较复杂,不太好想 ...
随机推荐
- Knowledge Point 20180308 拔下forEach的外衣
剖析加强for 很长一段时间对于foreach都有一种误解,那就是foreach只是普通for的包装,底层还是普通for循环,直到深入了解迭代器的时候,才发现自己错了,本节就来探讨一下foreach, ...
- Spring + Mybatis应该如何配置
### 1. MYBATIS简介 MYBATIS是持久层框架,大大的简化了持久层开发. 当使用MYBATIS框架时,开发人员不必再编写繁琐的JDBC代码,只需要定义好每个功能对应的抽象方法与需要执行的 ...
- URL参数获取/转码
JS中对URL进行转码与解码 1.escape 和 unescape escape()不能直接用于URL编码,它的真正作用是返回一个字符的Unicode编码值. 采用unicode字符集对指定的字符串 ...
- Kaggle比赛总结
做完 Kaggle 比赛已经快五个月了,今天来总结一下,为秋招做个准备. 题目要求:根据主办方提供的超过 4 天约 2 亿次的点击数据,建立预测模型预测用户是否会在点击移动应用广告后下载应用程序. 数 ...
- 常用EL函数汇总 fn:contains ,fn:substring,fn:substringAfter...
由于在JSP页面中显示数据时,经常需要对显示的字符串进行处理,SUN公司针对于一些常见处理定义了一套EL函数库供开发者使用.这些EL函数在JSTL开发包中进行描述,因此在JSP页面中使用SUN公司的E ...
- OAuth2.0 与 oauth2-server 库的使用
作者:baiyi链接:https://www.jianshu.com/p/83b0f6d82d6c來源:简书 OAuth2.0 是关于授权的开放网络标准,它允许用户已第三方应用获取该用户在某一网站的私 ...
- java中有关Volatile的几个小题
1.java中能创建volatile数组吗? 能,java中可以创建volatile数组,不过只是一个指向数组的引用,而不是整个数组,如果改变引用指向的数组,将会受到volatile的保护,但是如果多 ...
- rtsp over tcp并设置多个options
版权声明:本文为博主原创文章,未经博主允许不得转载. var vlc=document.getElementById("vlc"); var options = new Array ...
- 转载:C语言指针使用的注意事项
相信大家对指针的用法已经很熟了,这里也不多说些定义性的东西了,只说一下指针使用中的注意事项吧. 一.在定义指针的时候注意连续声明多个指针时容易犯的错误,例如int * a,b;这种声明是声明了一个指向 ...
- Git项目管理
参考 参考书籍 <git学习指南> 参考网站 https://git-scm.com/ Git局限性讨论 高复杂度 两张图看懂集中式版本管理系统和分布式管理系统的区别-集中式vs分布式 g ...