优先队列。
做法:维护两个优先队列:quesell 和 quebuy, 一个是小值优先,一个是大值优先。每次push的时候,都取各自的Top元素,比较价格,如果卖的比卖的出价低,则成交,各自的要买和要卖的股票数量减少能够减少的最大值,此时的DP(DealPrice)被记录下来。
具体见代码:

#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> #include <functional> using namespace std; #define N 100003 struct SELL { int price,num; bool operator <(const SELL &a)const { return price>a.price; } }; struct BUY { int price,num; bool operator <(const BUY &a)const { return price<a.price; } }; int main() { int t,n,i; char ss[8],share[9],at[4]; int num,price; SELL ka; BUY kb; scanf("%d",&t); int DP; while(t--) { priority_queue<SELL> quesell; priority_queue<BUY> quebuy; DP = -1; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s%d%s%s%d",ss,&num,share,at,&price); if(ss[0] == 'b') { kb.price = price; kb.num = num; quebuy.push(kb); } else { ka.price = price; ka.num = num; quesell.push(ka); } int minnum; if(!quesell.empty() && !quebuy.empty()) { while(1) { if(quesell.empty() || quebuy.empty()) break; BUY li = quebuy.top(); SELL wi = quesell.top(); if(wi.price <= li.price) { quebuy.pop(); quesell.pop(); if(wi.num > li.num) { wi.num -= li.num; quesell.push(wi); } else if(wi.num < li.num) { li.num -= wi.num; quebuy.push(li); } DP = wi.price; } else break; } if(!quesell.empty()) printf("%d ",quesell.top().price); else printf("- "); if(!quebuy.empty()) printf("%d ",quebuy.top().price); else printf("- "); if(DP == -1) printf("- "); else printf("%d ",DP); } else { if(!quesell.empty()) printf("%d ",quesell.top().price); else printf("- "); if(!quebuy.empty()) printf("%d ",quebuy.top().price); else printf("- "); if(DP == -1) printf("- "); else printf("%d ",DP); } } } return 0; }