京东笔试-交易清单(京东2016实习生真题)

题目描述

金融证券行业超好的薪酬待遇,吸引了大批的求职者前往应聘,小东也不例外,准备应聘一家证券公司。面试官为考察她的数据分析、处理和编码能力,为她准备了以下问题。

股票交易中,委托是指股票交易者在证券公司买卖股票。每手委托包括一个委托单号i、价格pi、买入或卖出标记di及交易数量qi。

交易处理中,需要把同类业务(买入或卖出)中相同价格的所有委托合并起来,形成一个清单。清单的第一部分为按价格降序排列的合并后的卖出委托,紧随其后的是按相同顺序排列的买入合并委托。证券公司比较关心的是比较抢手的s条合并委托信息,需要得到买入及卖出最抢手的s条合并委托。对于买入委托,抢手的是指报价高的委托,而卖出委托中报价低的较为抢手。若买或卖的合并委托数小于s条,则全部列入清单中。

现在小东拿到的是n个委托,请你帮忙找出最抢手的s个合并委托。

输入

输入有若干组,每组的第一行为两个正整数n和s(1<=n<=1000,1<=s<=50),分别表示委托数和最抢手的清单数,接下来的n行为具体的委托信息,每行包含3部分,第一部分为一个字母‘B’或‘S’,表示买入或卖出,后两部分为两个整数p和q,表示报价和数量。任何卖出委托的报价都比买入委托的报价高。

输出

输出不超过2s行合并委托清单,格式与输入相同。 

样例输入

6 2

B 10 3

S 50 2

S 40 1

S 50 6

B 20 4

B 25 10

样例输出

S 50 8

S 40 1

B 25 10

B 20 4


代码

#include<iostream>
#include<map>
using namespace std;

int main()
{
	int n, s;
	while (cin >> n >> s){
		map<int, int> Buy, Sell;
		int i, pice, num;
		char tmp;

		for (i = 0; i < n; i++){  //统计
			cin >> tmp >> pice >> num;
			if (tmp == 'S'){
				if (Sell.find(pice) == Sell.end()) Sell[pice] = num;
				else
					Sell[pice] += num;
			}
			else{
				if (Buy.find(pice) == Buy.end()) Buy[pice] = num;
				else Buy[pice] += num;
			}
		}
			int bCount = Buy.size()<s ? Buy.size() : s;
			int sCount = Sell.size()<s ? Sell.size() : s;

			map<int, int>::reverse_iterator l1 = Sell.rbegin();
			for (i = 0; i<Sell.size() - sCount; i++) l1++;

			for (; l1 != Sell.rend(); l1++)
				cout << 'S'<<" "<< l1->first <<" "<< l1->second << endl;
				map<int, int>::reverse_iterator l2 = Buy.rbegin();
				for (; bCount>0; bCount--, l2++)
					cout << 'B' << " " << l2->first << " "<< l2->second << endl;
	}
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值