題目鏈接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3252
題目描述:有一些文件需要打印機打印,每個人物有不同的優先級(1-9),打印機的運作方式爲:首先從打印隊列裏取出一個任務J,如果隊列裏有比J更急的任務,則直接把任務放到打印隊列的尾部,否則打印任務J。輸入打印隊列中各個任務的優先級以及所關注的任務在隊列中的位置(對首位置爲0)。輸出該任務完成時刻,所有任務都需要1分鐘的打印時間。例如,打印隊列爲{1,1,9,1,1,1},目前處於對首的任務最重完成時刻爲5.
思路:用一個隊列存儲當前打印序列,另外再用一個優先隊列存儲當前打印隊列,判斷打印隊列對首的元素是否等於優先隊列對首的元素,若是,則打印,並對隊列和優先隊列做pop操作,如不是則把隊列對首元素加入到隊尾。
代碼如下:
#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <sstream>
#include <fstream>
#include <queue>
using namespace std;
#define FILE
int main(int argc, char* argv[])
{
#ifdef FILE
ifstream in("data.txt");
ofstream out("output.txt");
cin.rdbuf(in.rdbuf());
cout.rdbuf(out.rdbuf());
#endif
int n;
cin>>n;
for(int i=0;i<n;i++)
{
int num, index;
queue<int> q;
priority_queue<int> pq;
cin>>num>>index;
for(int j=0;j<num;j++)
{
int rate;
cin>>rate;
pq.push(rate);
q.push(rate);
}
int x = 0;
while(true)
{
if(q.front()==pq.top())
{
if(x==index)
{
cout<<num-q.size()+1<<endl;
break;
}
else
{
q.pop();
pq.pop();
x++;
}
}
else
{
int temp = q.front();
q.pop();
q.push(temp);
if(x==index)
{
x=0;
index=q.size()-1;
}
else
{
x++;
}
}
}
}
return 0;
}