Description
The only printer in the computer science students' union is experiencing an extremely heavy workload. Sometimes there are a hundred jobs in the printer queue and you may have to wait for hours to get a single page of output.Input
One line with a positive integer: the number of test cases (at most 100). Then for each test case:Output
For each test case, print one line with a single integer; the number of minutes until your job is completely printed, assuming that no additional print jobs will arrive.Sample Input
3 1 0 5 4 2 1 2 3 4 6 0 1 1 9 1 1 1
Sample Output
1 2 5
題目思路:通過隊列模擬過程。一個隊列q保存輸入的數,一個優先隊列v。如果q隊列的第一個數是v隊列中優先級最大的數,就彈出它。如果不是,就把它放在隊列後面。一直這樣,直到彈出需要的數
代碼如下: (借鑒了,他人博客,╮(╯▽╰)╭... C++小白,求不追究責任....)
#include<iostream>
#include<queue>
using namespace std;
int main()
{
int t, n, m, x;
cin>>t;
while(t--)
{
cin>>n>>m;
queue<int>q;
priority_queue<int>v;//優先隊列,一聲明,就排列,按照優先級從大到小
for(int i=0; i<n; i++)
{
cin>>x;
q.push(x);//將輸入的X放到q隊列的隊尾
v.push(x);//將輸入的X放到V隊列的隊尾
}
while(1)
{
x=q.front();//將q隊列的第一個數賦值給x,用於接下來的判斷
q.pop();//彈出q隊列的第一個元素,先彈出來,接下來再判斷
if(m==0)
{
if(x!=v.top())//彈出來的數不是最大優先級
{
m=v.size()-1;//目標的位置變化
q.push(x);//將x(q.front)放到q隊列的隊尾
}
else// 是最大優先級
break;
}
else
{
m--;
if(x!=v.top()) //
q.push(x);
else
v.pop();//彈出v隊列的第一個元素,也就是最大優先級的數
}
}
cout<<n-q.size()<<endl;//n減去q隊列剩下的數目就是打印目標需要的時間
}
return 0;
}
/* push(x) 將x壓入隊列的末端
pop() 彈出隊列的第一個元素(隊頂元素),注意此函數並不返回任何值
front() 返回第一個元素(隊頂元素)
back() 返回最後被壓入的元素(隊尾元素)
empty() 當隊列為空時,返回true
size() 返回隊列的長度
top() 返回優先隊列中有最高優先級的元素*/