UVA 12266 Stock prices --优先队列

优先队列。 

做法:维护两个优先队列: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;
}
View Code
原文地址:https://www.cnblogs.com/whatbeg/p/3574753.html