优先队列。。刚开始用蠢办法,经过一个vector容器中转,这么一来一回这么多趟,肯定超时啊。
超时代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <cstdlib> #include <string> #include <vector> #include <map> #include <queue> #include <functional> using namespace std; #define N 30003 priority_queue<int,vector<int>,greater<int> > que; int A[N]; vector<int> tmp; int main() { int m,n,i,j,th,u,k,h; while(scanf("%d%d",&m,&n)!=EOF) { th = 0; for(i=0;i<m;i++) scanf("%d",&A[i]); j = 0; k = 0; for(i=0;i<n;i++) { scanf("%d",&u); while(j<u) { que.push(A[k++]); j++; } th++; for(h=1;h<th;h++) { tmp.push_back(que.top()); que.pop(); } printf("%d ",que.top()); for(h=0;h<tmp.size();h++) que.push(tmp[h]); tmp.clear(); } } return 0; }
后来看了网上某位大牛的,说是用两个优先队列,一个从大到小的,一个从小到大的,元素在这两个中间中转,可以大大缩短时间。
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <string> #include <vector> #include <map> #include <queue> #include <functional> using namespace std; #define N 30003 priority_queue<int,vector<int>,greater<int> > StoBig; //从小到大排,先出小的 priority_queue<int,vector<int>,less<int> > BtoSmall; //从大到小排,先出大的 int A[N]; int main() { int m,n,i,j,th,u,k,h; while(scanf("%d%d",&m,&n)!=EOF) { th = 0; for(i=0;i<m;i++) scanf("%d",&A[i]); j = 0; for(i=0;i<n;i++) { scanf("%d",&u); while(j<u) BtoSmall.push(A[j++]); th++; while(BtoSmall.size() >= th) //语句1 { StoBig.push(BtoSmall.top()); BtoSmall.pop(); } printf("%d ",StoBig.top()); BtoSmall.push(StoBig.top()); //还给它,保证语句1能够成立 StoBig.pop(); } } return 0; }