1. 程式人生 > >18.12.16 DSA 雙佇列

18.12.16 DSA 雙佇列

描述

系統A用來維護客戶。每個客戶的id用一個正整數K來表示,當客戶進入系統時用P來表示此使用者的優先度。這個系統有以下請求

0

系統停止執行

K P

優先度為P的客戶K進入系統

2

找到優先度最高的客戶,然後此客戶離開系統

3

找到優先度最低的客戶,然後此客戶離開系統

 

 

輸入

每行包括一個請求,最後一行包括一個停止請求(程式碼0)。對於新增客戶請求(程式碼1),優先度都是唯一的。客戶的表示K小於106

,優先度P小於107,一個客戶可能會被新增多次,每次的優先度可能不同。輸出對於每個請求2和3,程式必須輸出一行。這行包括此請求中找到客戶的id。如果系統中沒有客戶,輸出0

樣例輸入

2
1 20 14
1 30 3
2
1 10 99
3
2
2
0

樣例輸出

0
20
30
10
0
 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <stack>
 5 #include <string
> 6 #include <math.h> 7 #include <queue> 8 #include <stdio.h> 9 #include <string.h> 10 #include <vector> 11 #include <fstream> 12 #define maxn 100005 13 #define inf 999999 14 #define cha 127 15 using namespace std; 16 17 struct node { 18 int id, p;
19 node(int a, int b) { 20 id = a, p = b; 21 } 22 }; 23 deque<node>all; 24 25 void insert(int id,int p) { 26 all.push_front(node(id, p)); 27 int size = all.size(), i=0; 28 for (i = 1; i < size; i++) { 29 if (all[i].p <= p) 30 all[i-1] = all[i]; 31 else break; 32 } 33 all[i-1] = node(id, p); 34 } 35 36 void init() { 37 int cmd; 38 while (scanf("%d", &cmd) && cmd) { 39 if (cmd == 2) { 40 if (!all.empty()) { 41 printf("%d\n", all.back().id); 42 all.pop_back(); 43 } 44 else 45 printf("0\n"); 46 } 47 else if(cmd==3) { 48 if (!all.empty()) { 49 printf("%d\n", all.front().id); 50 all.pop_front(); 51 } 52 else 53 printf("0\n"); 54 } 55 else if (cmd == 1) { 56 int k, p; 57 scanf("%d%d", &k, &p); 58 insert(k, p); 59 } 60 } 61 } 62 63 int main() 64 { 65 init(); 66 return 0; 67 }
View Code

看到大家都1ms過就立刻用了線性時間演算法