1443.Printer Queue 基本队列操作

/*
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值