试题编号: 201412-3
试题名称: 集合竞价
时间限制: 1.0s
内存限制: 256.0MB
整个交易中有多个买单和卖单,要求求一个开盘价使得出价大于等于开盘价的买单总股数与小于等于开盘价的卖单总股数之间最小值最大,即能把最多的卖出股票卖给买入的人。
注意读入数据的方式,因为题目中输入数据有任意多行,所以以EOF(end of file)作为读入结束的条件。在C++中可以直接使用while(cin>>SOMETHING)语句。,每一笔交易的信息可以用一个结构体来保存,其中还需要保存交易的类型(买,卖,被取消)。可以使用一个结构体数组保存所有交易的信息,方便交易取消时进行修改。
容易发现答案中的开盘价一定是所有的卖出价和买入价中的一个值。所以一个简单的做法是遍历所有出现过的价格,计算这个价格下能交易的股票数量,如果数量大于当前最大值,就更新这个最大值,并保存这个价格。
如果要使程序的时间效率更优,可以分别保存买单和卖单并进行排序,计算交易数量时只需要统计到最后一个满足条件的交易单。比这个更好的解法是使用优先队列。
下面的程序使用了最简单的方法计算答案。
注意点:交易的股票数量可能超过int范围,需要使用long long保存。答案可以使用printf输出,printf(“%.2f “, ans)即输出保留两位小数的ans值。
#include<iostream>
#include<cstring>