Uva - 210 - Concurrency Simulator
自己写个双端队列,或者直接用deque,这个也比较好用
AC代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cctype>
#include <cstring>
#include <string>
#include <sstream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <bitset>
#include <cassert>
using namespace std;
const int maxn = 1000;
int c[5];
int n, quantum, var[26], ip[maxn];
// ip[pid]是程序pid的当前行号
bool locked;
char prog[maxn][10];
deque<int> readyQ; // 因为阻止队列的程序是插入到等待队列的首部,所以不能用queue,要用deque
queue<int> blockQ;
void run(int pid)
{
int q = quantum;
// 每次最多运行quantum时间
while (q > 0) {
char *p = prog[ip[pid]];
switch (p[2]) {
case '=': // 赋值语句
// 赋值要考虑两位数和一位数的情况
var[p[0] - 'a'] = isdigit(p[5]) ? (p[4] - '0') * 10 + p[5] - '0' : p[4] - '0';
q -= c[0];
break;
case 'i': // 打印语句
printf("%d: %d\n", pid + 1, var[p[6] - 'a']);
q -= c[1];
break;
case 'c': // lock
if (locked) {
blockQ.push(pid);
return;
}
locked = true;
q -= c[2];
break;
case 'l': // unlock
locked = false;
if (!blockQ.empty()) {
int pid2 = blockQ.front();
blockQ.pop();
readyQ.push_front(pid2);
// deque的操作push_front,插入到队首
}
q -= c[3];
break;
case 'd':
return;
}
ip[pid]++;
}
readyQ.push_back(pid);
}
int main()
{
int T;
scanf("%d", &T);
while (T--) {
scanf("%d %d %d %d %d %d %d\n", &n, &c[0], &c[1], &c[2], &c[3], &c[4], &quantum);
memset(var, 0, sizeof(var));
int line = 0;
for (int i = 0; i < n; i++) {
fgets(prog[line++], maxn, stdin);
ip[i] = line - 1;
while (prog[line - 1][2] != 'd') { // 判断是否是end
fgets(prog[line++], maxn, stdin);
}
readyQ.push_back(i);
}
locked = false;
while (!readyQ.empty()) {
// 取出队首元素执行
int pid = readyQ.front();
readyQ.pop_front(); // 别忘了把队首出队
run(pid);
}
if (T) {
printf("\n");
}
}
return 0;
}
Uva - 210 - Concurrency Simulator的更多相关文章
- uva 210 - Concurrency Simulator (并行程序模拟)
from CSDN: https://blog.csdn.net/su_cicada/article/details/87898579 例题6-1 并行程序模拟( Concurrency Simula ...
- 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 11423 - Cache Simulator (树状数组)
UVA 11423 - Cache Simulator (树状数组) option=com_onlinejudge&Itemid=8&category=523&page=sho ...
- 【例题 6-1 UVA - 210】Concurrency Simulator
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 队列模拟题. 注意初始化.. 然后题目中是让读入一个数据组数然后再输入数据的. 但样例..但样例没有!? [代码] #include ...
- UVa210 Concurrency Simulator (ACM/ICPC World Finals 1991) 双端队列
Programs executed concurrently on a uniprocessor system appear to be executed at the same time, but ...
- 并行程序模拟(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单位时间 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- C# ref与out
ref参数是引用,out参数为输出参数.我写一个控制台的程序来说明一下两者的特点和区别: class Program { 3 public static void RefMethod( ref int ...
- 安装redis,搭建环境
这里以redis-4.0.9为例 我自己为了好方便管理自己的软件包,就在/usr/local/目录下创建了一个software目录 mkdir /usr/local/software cd ...
- JavaScript原型与原型链
一.数据类型 JavaScript的数据类型可以分为基本数据类型和引用数据类型. 基本数据类型(6种) String Number Boolean null undefined Symbol(ES6) ...
- Node.js Query Strings
Query String 稳定性: 3 - 稳定 这个模块提供了一些处理 query strings 的工具,包括以下方法: querystring.stringify(obj[, sep][, eq ...
- Udemy上免费的angualr2视频教程分享
福利大分享 本文作者:苏生米沿 本文地址:http://blog.csdn.net/sushengmiyan/article/details/52592518 一晚上听了10几节课程,整体感觉很不错的 ...
- 《Non-Negative Matrix Factorization for Polyphonic Music Transcription》译文
NMF(非负矩阵分解),由于其分解出的矩阵是非负的,在一些实际问题中具有非常好的解释,因此用途很广.在此,我给大家介绍一下NMF在多声部音乐中的应用.要翻译的论文是利用NMF转录多声部音乐的开山之作, ...
- Redis之(六)配置详解
进入Redis的安装包,里面的"redis.conf"就是默认的配置文件,启动Redis Server的时候,可以指定加载某个路径下的配置文件"redis-server ...
- Gradle 1.12用户指南翻译——第五十二章. Maven 插件
本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上 ...
- Java中synchronized的使用实例
一.使用场景 在负责后台开发的时候,很多时候都是提供接口给前端开发人员去调用,会遇到这样的场景: 需要提供一个领奖接口,每个用户名只能领取一次,我们可以将成功领取的用户在数据库用个标记保存起来.如果这 ...
- 物料REVISION控制
--新增 INV_ITEM_REVISION_PUB.Create_Item_Revision ( p_api_version IN NUMBER , p_init_msg_list IN VARCH ...