程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Printer Queue,printerqueue

Printer Queue,printerqueue

編輯:C++入門知識

Printer Queue,printerqueue


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. 

Because some jobs are more important than others, the Hacker General has invented and implemented a simple priority system for the print job queue. Now, each job is assigned a priority between 1 and 9 (with 9 being the highest priority, 
and 1 being the lowest), and the printer operates as follows.
  • The first job J in queue is taken from the queue.
  • If there is some job in the queue with a higher priority than job J, thenmove J to the end of the queue without printing it.
  • Otherwise, print job J (and do not put it back in the queue).
In this way, all those importantmuffin recipes that the Hacker General is printing get printed very quickly. Of course, those annoying term papers that others are printing may have to wait for quite some time to get printed, but that's life. 

Your problem with the new policy is that it has become quite tricky to determine when your print job will actually be completed. You decide to write a program to figure this out. The program will be given the current queue (as a list of priorities) as well as the position of your job in the queue, and must then calculate how long it will take until your job is printed, assuming that no additional jobs will be added to the queue. To simplifymatters, we assume that printing a job always takes exactly one minute, and that adding and removing jobs from the queue is instantaneous.

Input

One line with a positive integer: the number of test cases (at most 100). Then for each test case:
  • One line with two integers n and m, where n is the number of jobs in the queue (1 ≤ n ≤ 100) and m is the position of your job (0 ≤ m ≤ n −1). The first position in the queue is number 0, the second is number 1, and so on.
  • One linewith n integers in the range 1 to 9, giving the priorities of the jobs in the queue. The first integer gives the priority of the first job, the second integer the priority of the second job, and so on.

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() 返回優先隊列中有最高優先級的元素*/

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved