zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    RESTClient使用
    web.xml 的加载过程
    I18N、L10N、G11N
    Oracle游标示例
    MyEclipse转换Eclipse项目无法启动问题(转)
    eclipse默认文件编码
    JAVA为什么要配置环境变量,怎样配置
    TODO Auto-generated method stub
    vc6开发ActiveX并发布全攻略(三)(转)
    高效使用hibernate-validator校验框架
  • 原文地址:https://www.cnblogs.com/whatbeg/p/3574753.html
Copyright © 2011-2022 走看看