UVa 210 并行程序模拟(deque)
题意:
模拟n个程序运行
格式一共有5种:var = constant(赋值);print var(打印);lock;unlock;end,
上述5种语句分别需
要t1、t2、t3、t4、t5单位时间
运行态的程序每次最多运行Q个单位时间(称为配额)
一个程序的配额用完之后,把当前语句(如果存在)执行完之后该程序会被插入一个等待队
列中,然后处理器从队首取出一个程序继续执行。
lock的作用是申请对所有变量的独占访问。lock和unlock总是成对出现,并且不会嵌套。
lock总是在unlock的前面。当一个程序成功执行完lock指令之后,其他程序一旦试图执行lock
指令,就会马上被放到一个所谓的阻止队列的尾部(没有用完的配额就浪费了)。当unlock
执行完毕后,阻止队列的第一个程序进入等待队列的首部。
输出运行程序的print
分析:
这道题题目很长,理解会有点困难, 没看过原题做的话会有挺多坑。
1.executed when the time quantum expires will be allowed to complete.
就是如果执行完当前指令后Q<0, 那么这个程序仍然可以运行, 之后就会结束运行
2.独占访问我一开始理解为如果被一个程序lock了, 那么只有这个lock程序可以修改变量, 其实并不是, lock后其他程序仍然可以修改变量。
3.那么这题就可以看成2个队列的模拟题了, 一个等待队列deque, 一个阻止队列queue。
4.一开始将所有数据先输入一个数组中, 然后用一个数组记录每个程序的初始行号, 这样模拟会比较方面。
5.找出不同指令的不同点, 用switch一次判断出来。
#include <bits/stdc++.h>
using namespace std;
const int maxl = ;
char pg[maxl][];
int n, quan, locked,t[], pgline[maxl];
int val[];
deque<int> Wait;
queue<int> Block;
void run(int num)
{
int q = quan;
while(q > ){
char *str = pg[pgline[num]];
switch(str[]){
case '='://var
val[str[] - 'a'] = isdigit(str[]) ?(str[] - '') * + str[] - '': str[] - '';
q -= t[];
break;
case 'i':// print
printf("%d: %d\n", num + , val[str[]-'a']);
q -= t[];
break;
case 'c': // lock
if(locked){
Block.push(num);
return;
}
locked = ;
q -= t[];
break;
case 'l': // unlock
locked = ;
if(!Block.empty()){
Wait.push_front(Block.front());
Block.pop();
}
q -= t[];
break;
case 'd': // end
return;
}
pgline[num] ++;
}
Wait.push_back(num);
} int main()
{ int T;
scanf("%d", &T);
while(T--){
int line = ;
memset(pgline,,sizeof(pgline));
memset(pg,,sizeof(pg));
memset(val,,sizeof(val));
scanf("%d %d %d %d %d %d %d ", &n, &t[], &t[], &t[], &t[], &t[], &quan);
for(int i = ; i < n; i++){
gets(pg[line++]);
pgline[i] = line - ;
while(pg[line-][] != 'd')
gets(pg[line++]); Wait.push_back(i);
} locked = ;
while(!Wait.empty()){
int pick = Wait.front();
Wait.pop_front();
run(pick);
}
if(T)
printf("\n");
}
return ;
}
UVa 210 并行程序模拟(deque)的更多相关文章
- uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...
- 6-1 并行程序模拟 uva210
用到了 deque 和queue 操作说明: queue qu: qu.push(x); int d=qu.front(); qu.pop(); 和栈一样只有push和pop ...
- 并行程序模拟(Concurrency Simulator, ACM/ICPC World Finals 1991,Uva210)
任务介绍 你的任务是模拟n个程序的并行运算.(按照输入编号为1~n)的并行执行. 代码实现 #define LOCAL #include<bits/stdc++.h> using name ...
- 【MPI学习6】MPI并行程序设计模式:具有不连续数据发送的MPI程序设计
基于都志辉老师<MPI并行程序设计模式>第14章内容. 前面接触到的MPI发送的数据类型都是连续型的数据.非连续类型的数据,MPI也可以发送,但是需要预先处理,大概有两类方法: (1)用户 ...
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...
- Java并发程序设计(二)Java并行程序基础
Java并行程序基础 一.线程的生命周期 其中blocked和waiting的区别: 作者:赵老师链接:https://www.zhihu.com/question/27654579/answer/1 ...
- N体运动的程序模拟
这依然是与<三体>有关的一篇文章.空间中三个星体在万有引力作用下的运动被称之为三体问题,参见我的上一篇文章:三体运动的程序模拟.而这一节,对三体问题进行了扩展,实现了空间中N个星体在万有引 ...
- C程序模拟实现银行家算法
C程序模拟实现银行家算法 上周又做操作系统实验,题目是用程序模拟实现银行家算法,写了半天还真有点晕,主要是因为想尽可能符合课本上的描述,所以写出来的程序就比较恶心了,好了,银行家算法就不多说了,不了解 ...
- JAVA并行程序基础
JAVA并行程序基础 一.有关线程你必须知道的事 进程与线程 在等待面向线程设计的计算机结构中,进程是线程的容器.我们都知道,程序是对于指令.数据及其组织形式的描述,而进程是程序的实体. 线程是轻量级 ...
随机推荐
- poj 1061 青蛙约会(扩展欧几里德)
题目链接: http://poj.org/problem?id=1061 题目大意: 中文题目,题意一目了然,就是数据范围大的出奇. 解题思路: 假设两只青蛙都跳了T次,可以列出来不定方程:p*l + ...
- bzoj2002 [Hnoi2010]Bounce 弹飞绵羊【分块】
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2002 这一题除了LCT解法,还有一种更巧妙,代码量更少的解法,就是分块.先想,如果仅仅记录每 ...
- 区间DP UVA 10739 String to Palindrome
题目传送门 /* 题意:三种操作,插入,删除,替换,问最少操作数使得字符串变成回文串 区间DP:有一道类似的题,有点不同的是可以替换,那么两端点不同的时候可以替换掉一个后成回文, 即dp[j+1][k ...
- 贪心 Codeforces Round #173 (Div. 2) B. Painting Eggs
题目传送门 /* 题意:给出一种方案使得abs (A - G) <= 500,否则输出-1 贪心:每次选取使他们相差最小的,然而并没有-1:) */ #include <cstdio> ...
- Android Dialogs(1)Dialog简介及Dialog分类
Dialogs A dialog is a small window that prompts the user to make a decision or enter additional info ...
- iOS生成PDF的关键代码-备忘
//此方法只是把当前页面的内容生成PDF并保存在沙盒中. //还需要做:把当前面没有显示的内容以分页的形式生成PDF,并把PDF读取并显示出来 //关于显示可以参考:念茜的博客 iOS开发笔记——PD ...
- JDK集合框架--综述
接下来的几篇博客总结一下对jdk中常用集合类知识,本篇博客先整体性地介绍一下集合及其主要的api: 从整体上来说,集合分两大类collection和map: 首先来看看Collection: c ...
- 正则表达式 - IP地址、Mac地址、端口、经纬度、车牌号码校验
IP地址验证: /^(\d|[1-9]\d|1\d{2}|2[0-5][0-5])\.(\d|[1-9]\d|1\d{2}|2[0-5][0-5])\.(\d|[1-9]\d|1\d{2}|2[0 ...
- Activity的四种启动模式区别
(1) standard 模式启动模式,每次激活Activity时都会创建Activity,并放入任务栈中. (2) singleTop 如果在任务的栈顶正好存在该Activity的实例, 就重用该实 ...
- java JDK在windows及mac下安装配置
windows下安装: JDK下载 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. ...