题目:http://poj.org/problem?id=1442
题意:n,m,分别是a数组,u数组的个数,u[i]w为几,就加到a几,然后输出第i 小的
刚开始用了一个小顶堆,超时,后来看了看别人的 代码,很巧妙的设计
1 #include<stdio.h> 2 #include<queue> 3 4 using namespace std; 5 6 int a[40000]; 7 int main() 8 { 9 int n,i,m,j,u; 10 priority_queue< int,vector<int>,less<int> > maxhead; 11 priority_queue< int,vector<int>,greater<int> > minhead; 12 scanf("%d %d",&n,&m); 13 for(i=1;i<=n;i++) 14 scanf("%d",&a[i]); 15 j=1; 16 for(i=1;i<=m;i++) 17 { 18 scanf("%d",&u); 19 while(j<=u ) 20 { 21 maxhead.push(a[j++]); //加到头大的队列里,队列里后i-1数始终是最小的 22 } 23 while(maxhead.size()>= i) //一直删到第i个数,包括i 24 { 25 minhead.push(maxhead.top()); 26 maxhead.pop(); 27 } 28 printf("%d ",minhead.top()); //头小的第一个就是 29 maxhead.push(minhead.top()); 30 minhead.pop(); 31 } 32 return 0; 33 }