NWERC2010 NKOJ2178 Stock Prices

因为题目数据较小,所以可以直接模拟。
每读入一个命令所要进行的操作:
如果是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;
}

 
 
 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值