并行程序模拟(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 这题真心的麻烦……程序不长但是推导过程比较复杂,不太好想 ...
随机推荐
- Azure服务器上不了外网
将服务器的DNS改成223.5.5.5或者223.6.6.6
- http://imgbase64.duoshitong.com/ 图片转换 base64
base64图片工具介绍: 1.支持 PNG.GIF.JPG.BMP.ICO 格式. 2.将图片转换为Base64编码,可以让你很方便地在没有上传文件的条件下将图片插入其它的网页.编辑器中. 这对于一 ...
- AppleDoc
使用AppleDoc快速生成iOS开发文档 _ 皮卡丘♪-(´ε` ) 用 appledoc 生成文档 _ Garan no dou xcode-select_ error_ tool 'xcodeb ...
- WSO2 API Manager 替换mysql作为数据库,解决AuthorizationUtils Could not set authorizations for the root问题
按照wso2官网(https://docs.wso2.com/display/ADMIN44x/Changing+to+MySQL)配置AM的数据库,想从H2换成Mysql5.7,费了将近一天的时间, ...
- wso2 ei 6.4.0安装笔记
目的:将最新版(6.4.0)部署在linux服务器,与Api Manager部署在同一环境 环境: Centos 7.3 Jdk 8 Mysql 5.7 问题一: 将H2替换为Mysql5.7数据库时 ...
- Java代码注释
单行注释: 选中代码,按下ctrl+/ 一条代码单行注释:选中一条代码按下ctrl+/,则为一条代码单行注释: 多条代码单行注释:选中多条代码按下ctrl+/,则为多条代码单行注释: 取消注释:对已经 ...
- Python图像处理:图像腐蚀与图像膨胀
图像的膨胀(Dilation)和腐蚀(Erosion)是两种基本的形态学运算,主要用来寻找图像中的极大区域和极小区域.其中膨胀类似于“领域扩张”,将图像中的高亮区域或白色部分进行扩张,其运行结果图比原 ...
- linux3.4.2之DMA驱动完整程序
/* *参考arch/arm/mach-s3c24xx/dma-s3c2410.c */ #include <linux/module.h> #include <linux/kern ...
- ACM1000:A + B Problem
Problem Description Calculate A + B. Input Each line will contain two integers A and B. Process to ...
- ggnetwork
ggnetwork ggnetwork PeRl 简介 ggnetwork是根据ggplot2的语法,开发的用于网络图可视化的包.虽然igraph是优秀的network处理包,但是在可视化方面依然是弱 ...