diff --git a/POJ/1442_lyhvoyage.cpp b/POJ/1442_lyhvoyage.cpp new file mode 100644 index 0000000..67f46c8 --- /dev/null +++ b/POJ/1442_lyhvoyage.cpp @@ -0,0 +1,62 @@ +#include +#include +using namespace std; +int a[30010], u[30010]; +int main() +{ + int n, m, i, j, k, x, ans; + while(~scanf("%d%d",&m,&n)) + { + priority_queue, less > que1; //队列中的元素从大到小排序 + priority_queue, greater > que2; //队列中的元素从小到大排序 + for(i = 1; i <= m; i++) + scanf("%d",&a[i]); + for(j = 1; j <= n; j++) + scanf("%d",&u[j]); + i = 0; + j = k = 1; + while(j <= n) + { + if(i == u[j]) //弹出第k小的数 + { + j++; + if(que1.size() < k) //que1里的元素不够k个 + { + x = que2.top(); + que1.push(x); + que2.pop(); + } + ans = que1.top(); + printf("%d\n",ans); + k++; //每次弹出一个数后,k的值都要加1 + } + else + { + i++; + //que1里的元素不够k个 + if(que1.size() < k) + { + que2.push(a[i]); + x = que2.top(); + que2.pop(); + que1.push(x); //先把a[i]压入que2,再从que2里取出最小值,压入que1 + } + + //如果que1的元素达到k个,且要压入队列的值比que1中的当前最大值大,说明que1中当前的最大值并不是第k小 + else if(que1.top() > a[i]) + { + x = que1.top(); + que1.pop(); + que2.push(x); + que1.push(a[i]); + } + //que1中的元素个数达到k个,且要压入队列的值比que1中的当前最大值小,说明que1中当前的最大值就是是第k小,则把a[i]直接压入que2中 + else + { + que2.push(a[i]); + } + } + } + } + return 0; +}