NWERC2010 NKOJ2178 Stock Prices
2011-10-09 18:55
549 查看
因为题目数据较小,所以可以直接模拟。
每读入一个命令所要进行的操作:
如果是buy,则该种价格的买入数+ni,将该种价格加入到买入价格的集合中。
如果是sell,则该种价格的卖出数+mi,将该种价格加入到卖出价格的集合中。
然后进行销售的操作:
比较最低的卖出价格和最高的买入价格,
如果前者小于等于后者则:
设最低卖出价格的卖出数为a,最高买入价格的买入数为b.
则a=a-min(a,b),b=b-min(a,b)
如果其中卖出数变为0,则在卖出价格集合中删去该种卖出价格。买入数同理。
记录股票价格
------------------------------------------------------------------------------------------------------
直到最低的卖出价格比最高的买入价格要高或者其中一个集合为空时跳出。
将余下来最低的卖出数不为0的卖出价格输出,如果卖出价格集合为空就输出”-”
买入价格同理,最后再输出股票价格
这样就完成了一次命令的操作
注意卖出价格集合为空和买入价格集合为空时的情况
代码如下:
每读入一个命令所要进行的操作:
如果是buy,则该种价格的买入数+ni,将该种价格加入到买入价格的集合中。
如果是sell,则该种价格的卖出数+mi,将该种价格加入到卖出价格的集合中。
然后进行销售的操作:
比较最低的卖出价格和最高的买入价格,
如果前者小于等于后者则:
设最低卖出价格的卖出数为a,最高买入价格的买入数为b.
则a=a-min(a,b),b=b-min(a,b)
如果其中卖出数变为0,则在卖出价格集合中删去该种卖出价格。买入数同理。
记录股票价格
------------------------------------------------------------------------------------------------------
直到最低的卖出价格比最高的买入价格要高或者其中一个集合为空时跳出。
将余下来最低的卖出数不为0的卖出价格输出,如果卖出价格集合为空就输出”-”
买入价格同理,最后再输出股票价格
这样就完成了一次命令的操作
注意卖出价格集合为空和买入价格集合为空时的情况
代码如下:
//by NKU lkjslkjdlk #include<cstdio> #include<cstring> #include<set> using namespace std; inline int min(int x,int y){return x<y?x:y;} int cas,or_num,sto_pri,i,bid[1005],ask[1005],trade_num,trade_pri,min_de; char order[100],tmp[10],bs[5],ch; set<int> bids,asks;set<int>::reverse_iterator biter;set<int>::iterator aiter; void print(){ if(asks.empty())printf("- ");else printf("%d ",*asks.begin()); if(bids.empty()) printf("- ");else printf("%d ",*bids.rbegin()); if(sto_pri==-1) printf("-\n");else printf("%d\n",sto_pri); } void sell(){ while(1){ biter=bids.rbegin();aiter=asks.begin(); if(*biter>=*aiter){ min_de=min(bid[*biter],ask[*aiter]); bid[*biter]-=min_de;ask[*aiter]-=min_de; sto_pri=*aiter; if(bid[*biter]==0) bids.erase(*biter); if(ask[*aiter]==0) asks.erase(*aiter); } if(asks.empty()||bids.empty()) break; if(*asks.begin()>*bids.rbegin()) break; } } int main() { scanf("%d",&cas); while(cas--){ bids.clear();asks.clear(); memset(bid,0,sizeof(bid));memset(ask,0,sizeof(ask)); scanf("%d%c",&or_num,&ch); for(i=0,sto_pri=-1;i<or_num;i++){ gets(order);sscanf(order,"%s %d %s %s %d",bs,&trade_num,tmp,tmp,&trade_pri); if(!strcmp(bs,"buy")){ bids.insert(trade_pri);bid[trade_pri]+=trade_num; if(!asks.empty()){sell();print();}else print(); } else{ asks.insert(trade_pri);ask[trade_pri]+=trade_num; if(!bids.empty()){sell();print();}else print(); } } } return 0; }
相关文章推荐
- NKOJ 2655 (HAOI 2010)计数(数位DP)
- 【例题】【三分套三分】NKOJ2644 【SCOI2010 DAY2】传送带
- NKOJ 2644 (SCOI 2010) 传送带(三分)
- NKOJ 3579 (NOI 2010)海拔(平面图最小割+对偶图)
- nkoj 2598||zjoj 2010
- 《计算机网络》复习题2010
- VC2010利用MySQL++访问mysql. 及连接池示例
- How to Enable Office Web Apps on SharePoint 2010
- 给 VS 2010 选一个好用的代码行数统计器(转)
- Tab控件--VC2010 使用TAB控件
- 2010 最 拉 风 的 话(看一看,乐一乐)
- 一起谈.NET技术,VS 2010 和 .NET 4.0 系列之《VS 2010代码智能提示的改进》篇
- Debug C++ in VS2010: problem1
- 【C/C++】Visual C++ 2010 新特性:并行计算
- AutoCAD 2010 简体中文版 64位 安装破解
- Word 2010艺术文字也疯狂 推荐
- sharepoint 2010中将web part作为图表的webpart的数据源实现的一些具体步骤。
- 微软发布官方TFS 2010 Scrum 模板
- bzoj 1776: [Usaco2010 Hol]cowpol 奶牛政坛
- Noip 2010 解题报告(机器翻译,乌龟棋,关押罪犯,引水入城)