问题 A: (ds:队列)打印队列
时间限制: 1 Sec 内存限制: 128 MB提交: 25 解决: 4
[提交][状态][讨论版]
题目描述
网络工程实验室只有一台打印机,它承担了非常繁重的工作。有时在打印机队列中有上百份的文件要打印,你可能要等上几个小时才能得到一页打印输出。
因为有些打印工作比较重要,所以Hacker General发明和实现了打印工作队列的一个简单的优先系统。每个打印工作被赋予了一个从1到9的优先级(9是最高优先级,l是最低优先级)。
打印机操作如下:
将队列中的第一个打印工作J从队列中取出;
如果在队列中有优先级高于J的打印工作,则不打印J,而是将J移到队列最后端;
否则,打印J(不将J移到队列最后端)。
用了这一方法,所有重要的文件能很快被打印。当然,令人烦恼的是其他的要被打印的文件要等上更多的时间。
现在的任务是确定你的打印工作什么时候被完成,请你写一个程序来计算它。给出当前队列(和优先级列表)以及你的工作在队列中的位置,计算需要多长时间你的工作才能被打印,假定队列中不会加入附加的工作。为了使事情简单化,我们设定一件打印工作恰好花费一分钟,向队列中添加一项打印工作和移走一件打印工作是在瞬间完成的。
输入
第一行给出一个正整数,表示测试用例的个数(最多100)。然后,对每个测试用例,第一行给出两个整数n和m,其中n是队列中的对象个数(l<=n<=100),m是你打印工作的位置(0<=m<=n-1)。队列中第一个位置编号为0,第二个位置编号为1,依次类推。
第二行给出n个整数,范围从l到9,给出队列中所有工作的优先级。第一个整数给出第一个打印工作的优先级,第二个整数给出第二个打印工作的优先级,依次类推。
输出
对每个测试用例输出一行,它是一个整数,表示到你的打印工作完成需要多少分钟。假定打印工作进行的时候没有附加的打印加入。
样例输入
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; }