好吧,又是看的网上的代码,双端队列似乎并不难,多了一个可以在前端插入的功能
用一个双队列来存储程序的id
用一个容器数组存储不同ID下的程序语句,
注意所有变量是共通的,所以变量值会互相影响;
还有要注意此题中所给的数据有问题,需要先输入一个T,表示一共有几组数据,再每组数据输入n表示几个程序,再输入5个数表示五种语句所用时间 最后输入执行时间
#include <iostream>
#include <cstdio>
#include <queue>
#include <deque>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 10024;
deque<int> wait;//存储进行的程序id
queue<int> block;
vector<string> pram[maxn];//用来存储代码
int t[6], Q;//t存储每种语句所用时间,Q用来存运行时间
int cnt[maxn];//当前执行程序的行数
int val[30];//存储变量的值
bool lock;//是否block
void run(int i){
int q = Q;
string s;
while(q > 0){
s = pram[i][cnt[i]];//读取代码
if('=' == s[2]){
int num = s[4] - '0';
q -= t[1];
if(6 == s.size()) num = 10 * num + s[5] - '0';//因为数值小于100
val[s[0]-'a'] = num;
}
else if('i' == s[2]){
q -= t[2];
printf("%d: %d\n", i, val[s[6]-'a']);
}
else if('c' == s[2]){
q -= t[3];
if(lock) {
block.push(i);
return ;
}
else lock = true;
}
else if('l' == s[2]){
q -= t[4];
lock = false;
if(!block.empty()){
wait.push_front(block.front());
block.pop();
}
}
else return ;
++cnt[i];
}
wait.push_back(i);
}
int main(){
int T, n;
cin >> T;
while(T--)
{
cin>>n;
for(int i = 0; i < 5; ++i) scanf("%d", &t[i+1]);
scanf("%d", &Q);
getchar();
string s;
for(int i = 1; i <= n; i++) pram[i].clear();
for(int i = 1; i <= n; i++){
while(true){
getline(cin, s);
pram[i].push_back(s);//输入代码
if(s == "end") break;
}
wait.push_back(i);
}
memset(cnt, 0, sizeof(cnt));
memset(val, 0, sizeof(val));
lock = false;
while(!wait.empty()){
int p = wait.front(); wait.pop_front();
run(p);
}
if(T) printf("\n");
}
return 0;
}