原题:
该题是运用双端队列的一道练习题,注意的点是当lock操作不成功时,在源lock程序unlock后应当返回的是lock语句,而非其后。
只要熟练运用队列,本题还是较为简单的。
代码:
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<sstream>
#include<queue>
#include<fstream>
#include<map>
#define endl "\n"
using namespace std;
void parse_equal(const string& s,string& left,string& right)
{
int k=s.find("=");
left=s.substr(0,k-1);
right=s.substr(k+2);
}
int main(void)
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n,t1,t2,t3,t4,t5,Q;
bool ok=false;
int T;
cin>>T;
while(T--)
{
int i=0;
cin>>n>>t1>>t2>>t3>>t4>>t5>>Q;
string s;
vector<queue<string>> dest(n);
deque<int> wait;//等待队列
queue<int> anti_wait,judge;//阻止队列 lock判断
map<string,int> val;//赋值语句映射
cin.get();
while(i<n)
{
while(getline(cin,s)&&s!="end")
{
dest[i].push(s);
}
dest[i].push(s);
wait.push_back(i);
i++;
}
if(ok)
{
cout<<endl;
}
else
{
ok=true;
}
while(!wait.empty())
{
int cur=wait.front();
wait.pop_front();
bool flag=true;
int t=Q;
while(t>0&&!dest[cur].empty())
{
string temp=dest[cur].front();
if(temp.find("=")!=string::npos)
{
string left,right;
parse_equal(temp,left,right);
val[left]=stoi(right,nullptr,10);
t-=t1;
}
else if(temp.find("print")!=string::npos)
{
string right=temp.substr(6);
cout<<cur+1<<": "<<val[right]<<endl;
t-=t2;
}
else if(temp=="lock")
{
t-=t3;
if(judge.empty())
{
judge.push(cur);
}
else
{
anti_wait.push(cur);
flag=false;
break;
}
}
else if(temp=="unlock")
{
t-=t4;
if(!judge.empty()&&cur==judge.front())
{
judge.pop();
}
if(!anti_wait.empty())
{
wait.push_front(anti_wait.front());
anti_wait.pop();
}
}
else
{
t-=t5;
flag=false;
break;
}
dest[cur].pop();
}
if(flag)
{
wait.push_back(cur);
}
}
}
return 0;
}
?
|