1、题意要求使用的其实是双端队列(deque) 具体操作包括:
1.创建时,和其他容器一样的格式,如deque a; 也可以限定元素个数和内容,详细见上述网页;注意要使用头文件deque
2.常用函数: a.push_front() a.push_back() a.pop_front() a.pop_back()从队首或队尾入队或出队
自己在做题时因为还不知道deque所以冒险采用了人工出入队列使得元素插入到队列头,有超时风险,这道题没事
while(exe.front()!=locked.front())
{
int tmp = exe.front();
exe.pop();
exe.push(tmp);
}//把解锁的的程序放在队头
如果采用dequeue,则上述操作为:
exe.push_front(locked.front);
locked.pop();
2、最好把run即程序运行的过程写成函数,这样在遇到Lock锁lock和end时可以直接return避免程序再入等待队列。
自己写的时候没有使用函数,增加了一个标志量用来区分是否需要将程序再入队列。
3、自己理解的题意是时间片不够一个命令执行时就放弃时间了(这样写会导致TLE),但其实是只要时间片>0,不管是否够一个指令执行完成,都会执行该指令,然后剩余时间<0再切换程序。
Any instruction currently being executed when the time quantum expires will be allowed to complete.
题意里有这句话:当时间量到期时当前正在执行的任何指令都将被允许完成。
4、代码要尽量简洁,将重复的代码分出来执行。
5、输入其实有些复杂,但自己写的时候还比较顺利,记得注意getline(cin,s)会读取之前留下的回车,导致s为’\n’没有输入。
//初始化
initial();
queue<string>pro[100];
queue<int>exe;//等待执行队列
queue<int>locked;//被锁住的程序队列
if(T++)
printf("\n");
int pro_num,per_time;
cin>>pro_num;
for(int i=0;i<5;i++)
cin>>ord_time[i];
cin>>per_time;
getchar();//读取多余空行
string order;
for(int i=0;i<pro_num;i++)
{
while(getline(cin,order))
{
//cout<<"get: "<<order<<endl;
pro[i].push(order);
if(order=="end")
break;
}
exe.push(i);
}