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<iostream>
#include<string>
#include<queue>
#include<map>
using namespace std;struct MES {int id;int size;int price;int bs;bool operator< (const MES &rhs) const {if(this->price != rhs.price) {return this->price < rhs.price;}return this->id > rhs.id;}bool operator> (const MES &rhs) const {if(this->price != rhs.price) {return this->price > rhs.price;}return this->id > rhs.id;}
};vector<MES> vmes;
priority_queue<MES, vector<MES>, less<MES>> buys;
priority_queue<MES, vector<MES>, greater<MES>> sells;
map<int, int> mpBuy, mpSell;void deleteMes(int id) {if(id >= vmes.size() || !vmes[id].size) {return;}if(vmes[id].bs > 0) {mpBuy[vmes[id].price] -= vmes[id].size;} else {mpSell[vmes[id].price] -= vmes[id].size;}vmes[id].size = 0;
}void buyMes(MES &m) {MES m1, m2;int size, price;while(!sells.empty() && m.size) {m1 = sells.top();if(vmes[m1.id].size == 0) {sells.pop();continue; }if(vmes[m1.id].price > m.price) {break;}price = vmes[m1.id].price;if(m.size >= vmes[m1.id].size) {size = vmes[m1.id].size;sells.pop();} else {size = m.size;}mpSell[price] -= size;m.size -= size;vmes[m1.id].size -= size;cout << "TRADE " << size << " " << price << endl;}
}void sellMes(MES &m) {MES m1, m2;int size, price;while(!buys.empty() && m.size) {m1 = buys.top();if(vmes[m1.id].size == 0) {buys.pop();continue; }if(vmes[m1.id].price < m.price) {break;}price = vmes[m1.id].price;if(m.size >= vmes[m1.id].size) {size = vmes[m1.id].size;buys.pop();} else {size = m.size;}mpBuy[price] -= size;m.size -= size;vmes[m1.id].size -= size;cout << "TRADE " << size << " " << price << endl;}
}int main() {int n, i, j, k;int id;string s;MES m1, m2;int size, price;bool flag = false; while(cin >> n && n != 0) {if(flag == false) {flag = true;} else {cout << endl; }priority_queue<MES, vector<MES>, less<MES>> buysT;priority_queue<MES, vector<MES>, greater<MES>> sellsT;buys = buysT;sells = sellsT;mpBuy.clear();mpSell.clear();vmes.clear();for(i = 0; i < n; ++i) {MES m;m.id = i;cin >> s;if(s == "CANCEL") {cin >> id;id = id - 1;deleteMes(id);m.price = 0;m.size = 0;} else {cin >> m.size >> m.price;if (s == "BUY") {m.bs = 1;buyMes(m);if(m.size > 0) {if(!mpBuy.count(m.price)) {mpBuy[m.price] = 0;}mpBuy[m.price] += m.size;buys.push(m);}} else { //sellm.bs = -1;sellMes(m);if(m.size > 0) {if(!mpSell.count(m.price)) {mpSell[m.price] = 0;}mpSell[m.price] += m.size;sells.push(m);}}}vmes.push_back(m);cout << "QUOTE ";size = 0; price = 0;while(!buys.empty()) {m1 = buys.top();if(vmes[m1.id].size == 0) {buys.pop();continue; }price = vmes[m1.id].price;size =  mpBuy[vmes[m1.id].price];break; }cout << size << " " << price;cout << " - ";size = 0; price = 99999;while(!sells.empty()) {m1 = sells.top();if(vmes[m1.id].size == 0) {sells.pop();continue; }price = vmes[m1.id].price;size =  mpSell[vmes[m1.id].price];break;}cout << size << " " << price;cout << endl; }}return 0;
}

UVA-1598 交易所 题解答案代码 算法竞赛入门经典第二版相关推荐

  1. UVA-12171 雕塑 题解答案代码 算法竞赛入门经典第二版

    GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 这道题目在<算法竞赛入门经典第二版>书中标注了星号,也是第一道出现星号的 ...

  2. UVA-814 邮件传输代理的交互 题解答案代码 算法竞赛入门经典第二版

    GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 AC代码 #include<iostream> #include< ...

  3. UVA-508 莫尔斯电码 题解答案代码 算法竞赛入门经典第二版

    https://github.com/jzplp/aoapc-UVA-Answer 这个题目就是在考验英语水平呀!(或者题目本身也写的不清楚) 尤其是多个完全匹配(!)和模糊匹配(?)的情况,我题意看 ...

  4. UVA-12412 师兄帮帮忙 题解答案代码 算法竞赛入门经典第二版

    https://github.com/jzplp/aoapc-UVA-Answer 好麻烦的一道题. 题目没说如果在选菜单,query和stat的时候输入的时候如果是错误的怎么办,根据测试知道是重新输 ...

  5. 算法竞赛入门经典第二版课后习题答案第二章

    算法竞赛入门经典第二版课后习题答案 第二章 习题2-1水仙花数 输出100-999中的所有水仙花数.若三位数ABC满足ABC=A^3+B^3+C^3,则称其为水仙花数.例如153=1^3+5^3+3^ ...

  6. 补学图论算法:算法竞赛入门经典(第二版)第十一章:

    补学图论算法:算法竞赛入门经典(第二版)第十一章: 倒排索引还没有实现! 下面是左神的图论算法,并查集笔记.和一个美团题目. ''' https://www.nowcoder.com/live/11? ...

  7. 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 习题(12/14)

    文章目录 说明 习题 习6-1 UVA 673 平衡的括号 习6-2 UVA 712 S - 树 习6-3 UVA 536 二叉树重建 习6-4 UVA 439 骑士的移动 习6-5 UVA 1600 ...

  8. 算法竞赛入门经典第二版:循环结构程序设计实例与习题

    实例: 1.阶乘之和 输入n,计算S= 1!+2!+3!+-+n!的末六位. 分析:两个循环,里面循环用于计算不同数的阶乘,外面一个循环用于将所有阶乘相加,核心算法 "for(int i=1 ...

  9. 算法竞赛入门经典(第二版) | 程序3-6 WERTYU (UVa 10082)(常量数组)

    题目描述: 输入一个按键盘顺序,向后错一位后敲出的字符串,输出本来想打出的句子, 且输入中不会出现不合法的字符,例如A. Simple input: O S, GOME YPFSU/ Simple o ...

最新文章

  1. Spring Task配置
  2. Centos7 安装lnmp
  3. 计算机网络(一)计算机网络概述、组成、功能分类、性能指标 | 思维导图
  4. 菜鸟级WEX5开发之路【用B/S开发经验应用到WEX5的开发中来】
  5. Java常用spark的pom.xml与读取csv为rdd到最终join操作+java常用pom.xml文件
  6. 计算机网络运输层的概述,计算机网络_运输层
  7. android下载图片服务,Android中的背景图片下载需要帮助吗?
  8. 信息传递(luogu 2661)
  9. 库克回应 iPhone 11 系列不支持 5G;哈啰 App 被下架;Flutter 1.9 稳定版发布 | 极客头条...
  10. LeetCode 152. Maximum Product Subarray
  11. 为numpy数组增加一个维度的方法
  12. Qtum量子链入驻慢雾区,漏洞赏金计划单项最高奖励达1万美金!
  13. 游戏挂机计算机自己保护怎么办,游戏中遇到玩家挂机该如何应对?做好这5件事可以降低输的机率...
  14. 微信加人的108种方法
  15. LFMCW雷达测速基础- 多普勒频移和2DFFT
  16. 【git】git的删除命令与如何删除仓库文件的方法
  17. CuraEngine VS2017
  18. 短址(short URL)原理及其实现 来源:http://blog.csdn.net/beiyeqingteng
  19. 前端常用属性知识点--文档
  20. Principal Component Analysis 主成分分析 【学习笔记】

热门文章

  1. 详解Spring工作原理
  2. 【Vue原理】Vue源码阅读总结大会 - 序
  3. Z05 - 025、明细表、宽表、窄表 - 实现
  4. SpringBoot整合Redisson实现延迟队列
  5. 用佳能单反运行我的世界服务器,真的可以!
  6. keras 损失函数汇总
  7. android 事件失效,TouchEnd事件在Android上不起作用
  8. 常见算法思路及技巧总结一
  9. 图像对比算法有哪些,图像对比算法是什么
  10. 狮子和羚羊----精神的追求!