沧州网站建设专业定制,现代营销手段有哪些,旅游休闲类网站的建设,长沙微信营销公司你的任务是模拟n个程序#xff08;按输入顺序编号为1#xff5e;n#xff09;的并行执行。每个程序包含不超过25条语句#xff0c;格式一共有5种#xff1a;var constant#xff08;赋值#xff09;#xff1b;print var#xff08;打印#xff09;#xff1b;lock…你的任务是模拟n个程序按输入顺序编号为1n的并行执行。每个程序包含不超过25条语句格式一共有5种var constant赋值print var打印lockunlockend。 变量用单个小写字母表示初始为0为所有程序公有因此在一个程序里对某个变量赋值可能会影响另一个程序。常数是小于100的非负整数。 每个时刻只能有一个程序处于运行态其他程序均处于等待态。上述5种语句分别需要t1、t2、t3、t4、t5单位时间。运行态的程序每次最多运行Q个单位时间称为配额。当一个程序的配额用完之后把当前语句如果存在执行完之后该程序会被插入一个等待队列中然后处理器从队首取出一个程序继续执行。初始等待队列包含按输入顺序排列的各个程序但由于lock/unlock语句的出现这个顺序可能会改变。 lock的作用是申请对所有变量的独占访问。lock和unlock总是成对出现并且不会嵌套。lock总是在unlock的前面。当一个程序成功执行完lock指令之后其他程序一旦试图执行lock指令就会马上被放到一个所谓的阻止队列的尾部没有用完的配额就浪费了。当unlock执行完毕后阻止队列的第一个程序进入等待队列的首部。 输入n, t1, t2, t3, t4, t5, Q以及n个程序按照时间顺序输出所有print语句的程序编号和结果。
样例 输入
3 1 1 1 1 1 1
a 4
print a
lock
b 9
print b
unlock
print b
end
a 3
print a
lock
b 8
print b
unlock
print b
end
b 5
a 17
print a
print b
lock
b 21
print b
unlock
print b
end输出
1: 3
2: 3
3: 17
3: 9
1: 9
1: 9
2: 8
2: 8
3: 21
3: 21解法
use std::collections::{HashMap, VecDeque};
use std::io;fn main() {let mut buf String::new();io::stdin().read_line(mut buf).unwrap();let v: Vecusize buf.split_whitespace().map(|x| x.parse().unwrap()).collect();let n v[0];let q v[6];let mut programs vec![];for _i in 0..n {let mut prog_stats vec![];loop {let mut buf String::new();io::stdin().read_line(mut buf).unwrap();let mut run_time 0;if let Some(_idx) buf.find() {run_time v[1];} else if buf.starts_with(print) {run_time v[2];} else if buf.starts_with(lock) {run_time v[3];} else if buf.starts_with(unlock) {run_time v[4];} else if buf.starts_with(end) {run_time v[5];}prog_stats.push((buf.trim().to_string(), run_time));if buf.trim() end {programs.push(prog_stats);break;}}}let mut wait_progs VecDeque::new();for i in 0..n {wait_progs.push_back((i, 0, 0));}let mut block_progs VecDeque::new();let mut lock (false, 0);let mut vars HashMap::new();while let Some(mut prg) wait_progs.pop_front() {let mut run_time q;while run_time 0 {let statement programs[prg.0][prg.1].0;if statement.starts_with(lock) {if lock.0 true lock.1 ! prg.0 {block_progs.push_back(prg);break;} else {lock.0 true;lock.1 prg.0;}} else if statement.starts_with(unlock) {lock.0 false;lock.1 0;if let Some(prg) block_progs.pop_front() {wait_progs.push_front(prg);}} else if let Some(idx) statement.find() {let var statement[0..idx - 1].to_string();let value: usize statement[idx 2..].parse().unwrap();vars.insert(var, value );} else if statement.starts_with(print) {let var statement[6..].to_string();println!({}: {}, prg.0 1, vars.get(var).unwrap());}let min_time (programs[prg.0][prg.1].1 - prg.2).min(run_time);prg.2 min_time;run_time - min_time;if prg.2 programs[prg.0][prg.1].1 {wait_progs.push_back(prg);} else if prg.1 programs[prg.0].len() - 1 {prg.1 1;prg.2 0;if run_time 0 {wait_progs.push_back(prg);}} else {break;}}}
}