/*
1443.Printer Queue 基本队列操作
题目大意:
给出一个长度为n的打印任务队列,每个任务有优先级。每次从队列头得到一个任务,如果它是剩余任务中优先级最高的,则打印它,否则放到队列尾。求出其中某个特定任务是第几个被执行的。
n<=100
解题思路:
使用队列直接模拟。
取出队列头判断是否打印,如果打印则已打印任务数加一。
直到特定的任务完成,输出答案。
*/
#include <iostream>
#include <deque>
using namespace std;
//重点1:学会灵活使用结构体,务必记住!
struct node{
int priority;
int position;
};
/*重点2:STL容器:详细见笔记!
① deque、vector容器,相当于可变化数组,一般使用insert、erase插入删除,使用数组下标访问(也可以使用迭代器);
② list容器一般使用insert、erase插入删除,使用迭代器iterator *it 访问;
③ stack、queue一般使用push插入、使用pop删除,使用top、front访问,不能使用迭代器;
*/
int main(){
int t;
int m;
int n;
int sum = 0;
deque <node> jobs;
struct node job[101];
cin >> t;
//错误3:循环错误for(int i = 0 ; i < t ; t++){
for(int i = 0 ; i < t ; i++){
jobs.clear(); //错误1:忘记清空
sum = 0; //错误2:忘记置零
cin >> n >> m;
for (int j=0;j<n;j++){
cin >> job[j].priority;
job[j].position = j;
}
for(int j=0;j<n;j++){
jobs.insert(jobs.end(),job[j]);
}
//错误3:循环错误for(int t=0;t<n-1;t++){ 应该改为判断队列是否为空 for(int k=0;jobs.size()!=0;k++){
for(int k=0;k<10000;k++){
if(jobs.size()!=0){ //重点3:判断是否为空,否则会发生溢出
bool flag=false;
//3.错误:for(int j=0;j<n;j++){ n需要变化,一般改为jobs.size()
for(int j=0;j<jobs.size();j++){
if(jobs[0].priority < jobs[j].priority){
flag = true;
break;
}
}
if(flag == true){
struct node temp = jobs[0];
jobs.erase(jobs.begin());
jobs.insert(jobs.end(),temp);
}else {
struct node temp = jobs[0];
jobs.erase(jobs.begin());
sum ++ ;
//n = jobs.size();
if(temp.position == m) //错误4:if语句忘记{}
{
cout << sum <<endl;
break;
}
}
}
}
}
//system("pause");
return 0;
}
1443.Printer Queue 基本队列操作
最新推荐文章于 2021-11-16 17:30:03 发布