GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版
AC代码
有意思的一个题目。书上说这是一个不错的优先队列练习题,但实际上它其实是一个让我们了解优先队列有哪些限制的题目。
其他同学的很多题解因为优先队列限制太大,转而使用了map等结构作为优先队列的代替。我这里还是使用的优先队列。
这个题目碰到的优先队列的限制有:
1. 不能清空优先队列,无法clear
2. 不能遍历,只能查看堆顶元素
3. 默认是大顶堆,自行改变判断规则有些麻烦
因此,如果想要用优先队列做这道题,必须用到很多辅助的数据结构,比如我用到了vector,map来辅助查找。不能清空,那就只能重新赋值空队列了。
这个题目的一些注意事项:
1. 题目可能有多组数据,每组之间需要空行
2. 成交价格对当前处理的最新消息有利。比如如果新来的是买消息,那么买的价格会按照当前卖出队列的最低价格成交,而不是买消息中的价格。卖消息则使用买入队列的最高价格成交。
(所以如果我是参与交易者,我会一直出价再撤回,这样才有可能以最低价格买入,最高价格卖出)
3. 撤回消息时,如果该消息已经交易成功,那么无需任何处理。如果未成功或者已经成功了一部分,则剩下的部分被禁止交易。输出的最低最高价格中也不包含撤回的消息。
4. 如果新来的一个消息与多个队列中的消息成交,且价格相同,那么在成交的消息中,不需要合并为一条消息输出,而是分成多条输出。比如。
TRADE 200 32
TRADE 200 32
TRADE 300 32
但是在QUOTE消息中,同价格的却需要合并到一条输出。
#include
#include
#include
#include