zoukankan      html  css  js  c++  java
  • ACM程序设计选修课——1044: (ds:队列)打印队列(queue模拟)

    问题 A: (ds:队列)打印队列

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 25  解决: 4
    [提交][状态][讨论版]

    题目描述

        网络工程实验室只有一台打印机,它承担了非常繁重的工作。有时在打印机队列中有上百份的文件要打印,你可能要等上几个小时才能得到一页打印输出。

        因为有些打印工作比较重要,所以Hacker General发明和实现了打印工作队列的一个简单的优先系统。每个打印工作被赋予了一个从19的优先级9是最高优先级,l是最低优先级)

    打印机操作如下:

       将队列中的第一个打印工作J从队列中取出

    如果在队列中有优先级高于J的打印工作,则不打印J,而是将J移到队列最后端;

    否则,打印J(不将J移到队列最后端)。

       用了这一方法,所有重要的文件能很快被打印。当然,令人烦恼的是其他的要被打印的文件要等上更多的时间。

       现在的任务是确定你的打印工作什么时候被完成,请你写一个程序来计算它。给出当前队列(和优先级列表)以及你的工作在队列中的位置,计算需要多长时间你的工作才能被打印,假定队列中不会加入附加的工作。为了使事情简单化,我们设定一件打印工作恰好花费一分钟,向队列中添加一项打印工作和移走一件打印工作是在瞬间完成的。

    输入

    第一行给出一个正整数,表示测试用例的个数(最多100)。然后,对每个测试用例,第一行给出两个整数nm,其中n是队列中的对象个数(l<=n<=100),m是你打印工作的位置(0<=m<=n-1)。队列中第一个位置编号为0,第二个位置编号为1,依次类推。

        第二行给出n个整数,范围从l9,给出队列中所有工作的优先级。第一个整数给出第一个打印工作的优先级,第二个整数给出第二个打印工作的优先级,依次类推。

    输出

    对每个测试用例输出一行,它是一个整数,表示到你的打印工作完成需要多少分钟。假定打印工作进行的时候没有附加的打印加入。

    样例输入

    3
    1 0
    5
    4 2
    1 2 3 4
    6 0
    1 1 9 1 1 1

    样例输出

    1
    2
    5

    第一次用deque模拟不知道为什么错了。经过聚聚指导,用两个queue过了。

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<set>
    #include<map>
    #include<sstream>
    #include<algorithm>
    #include<cmath>
    #include<cstdlib>
    #include<deque>
    using namespace std;
    typedef pair<int,bool> pii;
    bool cmp(const int &a,const int &b)
    {
    	return a>b;
    }
    int main (void)
    {
    	int t,i,j,ans,n,k,yy,temp;
    	bool ok,haole;
    	cin>>t;
    	while (t--)
    	{
    		cin>>n>>k;
    		int num[150]={0};
    		int cnt=0;
    		queue<pii>list;//模拟队列
    		queue<int>pri;//优先级排序队列
    		for (int i=0; i<n; i++)
    		{
    			cin>>yy;
    			if(i!=k)
    				list.push(pii(yy,false));
    			else
    				list.push(pii(yy,true));
    			num[cnt++]=yy;						
    		}
    		sort(num,num+cnt,cmp);//先放在临时数组里排序一下
    		for (int i=0; i<n; i++)
    		{
    			pri.push(num[i]);//放入优先队列
    		}		
    		ans=0;
    		haole=0,ok=0;
    		while (!haole)
    		{
    			while ((list.front()).first!=pri.front())//若开头的不是优先级最高
    			{			
    				list.push(list.front());
    				list.pop();
    			}
    			if((list.front()).second==true)//若开头的是被标记的任务,直接打印+break
    			{
    				ans++;
    				break;
    			}
    			list.pop();
    			pri.pop();
    			ans++;
    		}
    		cout<<ans<<endl;
    	}
    	return 0;
    }
  • 相关阅读:
    厦门,第二天
    react结合redux开发
    react native中使用ScrollableTabView
    react native中使用 react-native-easy-toast 和react-native-htmlview
    react native中使用native-echarts
    react native 使用TabNavigator编写APP底部导航
    react native 初识生命周期
    react native初识
    禁止浏览器返回登入页面
    vue中使用echarts来绘制世界地图和中国地图
  • 原文地址:https://www.cnblogs.com/Blackops/p/5356403.html
Copyright © 2011-2022 走看看