UVA 12100 打印隊列(STL deque)
阿新 • • 發佈:2017-05-20
bsp -1 優先級 break 位置 for mes ifd cond
題意:
給定n個優先級打印隊列,然後從0開始編號到n-1。出隊一個元素,如果他是隊列中優先級最高的,打印(耗時一分鐘),否則放到隊尾(不耗時)。給定一個m,求位置m的文件打印的時間。
分析:
用一個priority_queue去尋找優先級最高的元素,然後用一個deque<pair<int,int> >去模擬隊列 pair第一個元素是優先級, 第二個是序號。 如果第一元素跟優先級相同,就出隊,否則出隊後插入隊尾。
(其實這題用queue也可以,不過deque好處是可以在隊頭插入,而且速度不慢)
1 #include <bits/stdc++.h>
2 using namespace std;
3 typedef pair<int, int > PII;
4 int n, m;
5 int main()
6 {
7 ios::sync_with_stdio(false);
8 #ifdef LOCAL
9 freopen("1.txt","r",stdin);
10 #endif // LOCAL
11 int t;
12 cin >> t;
13 while(t--)
14 {
15 cin>>n>>m;
16 priority_queue<int ,vector<int>, less<int> > pq;
17 deque<PII> dq;//pair第一個是優先級 第二個是序號
18 int pos = 0;
19 for(int i = 0 ; i < n; i++)
20 {
21 int p;
22 cin>>p;
23 pq.push(p);
24 dq.push_back(make_pair(p,pos));
25 pos++;
26 }
27 int res = 0;
28 int print = 0;
29 while(1)
30 {
31 int top = pq.top();
32 pq.pop();
33 while(dq.front().first!= top)
34 {
35 PII f = dq.front();
36 dq.pop_front();
37 dq.push_back(f);
38 }
39 if(dq.front().second == m)
40 {
41 ++res;
42 break;
43 }
44 else
45 {
46 dq.pop_front();
47 ++res;
48 }
49 }
50 cout << res << "\n";
51 }
52
53 }
UVA 12100 打印隊列(STL deque)