当前位置: 首页 > news >正文

交易所(Exchange, ACM/ICPC NEERC 2006, UVa1598)rust解法

你的任务是为交易所设计一个订单处理系统。要求支持以下3种指令。
BUY p q:有人想买,数量为p,价格为q。
SELL p q:有人想卖,数量为p,价格为q。
CANCEL i:取消第i条指令对应的订单(输入保证该指令是BUY或者SELL)。
交易规则如下:对于当前买订单,若当前最低卖价低于当前出价,则发生交易;对于当前卖订单,若当前最高买价高于当前价格,则发生交易。发生交易时,按供需物品个数的最小值交易。交易后,需修改订单的供需物品个数。当出价或价格相同时,按订单产生的先后顺序发生交易。

样例:
输入

11
BUY 100 35
CANCEL 1
BUY 100 34
SELL 150 36
SELL 300 37
SELL 100 36
BUY 100 38
CANCEL 4
CANCEL 7
BUY 200 32
SELL 500 30

输出

QUOTE 100 35 - 0 99999
QUOTE 0 0 - 0 99999
QUOTE 100 34 - 0 99999
QUOTE 100 34 - 150 36
QUOTE 100 34 - 150 36
QUOTE 100 34 - 250 36
TRADE 100 36
QUOTE 100 34 - 150 36
QUOTE 100 34 - 100 36
QUOTE 100 34 - 100 36
QUOTE 100 34 - 100 36
TRADE 100 34
TRADE 200 32
QUOTE 0 0 - 200 30

分析:
一个订单成交过的部分不能取消。

解法:

use std::{collections::{BinaryHeap, HashMap},io::{self, Read},
};
struct Order {_id: usize,amount: usize,price: usize,op: String,
}
#[derive(Debug, PartialEq, Eq)]
struct Buy {id: usize,amount: usize,price: usize,
}
impl Ord for Buy {fn cmp(&self, other: &Self) -> std::cmp::Ordering {if self.price != other.price {self.price.cmp(&other.price)} else {other.id.cmp(&self.id)}}
}
impl PartialOrd for Buy {fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {Some(self.cmp(other))}
}
#[derive(Debug, PartialEq, Eq)]
struct Sell {id: usize,amount: usize,price: usize,
}
impl Ord for Sell {fn cmp(&self, other: &Self) -> std::cmp::Ordering {if self.price != other.price {other.price.cmp(&self.price)} else {other.id.cmp(&self.id)}}
}
impl PartialOrd for Sell {fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {Some(self.cmp(other))}
}
fn main() {let mut buf = String::new();io::stdin().read_line(&mut buf).unwrap();let n: usize = buf.trim().parse().unwrap();let mut orders: Vec<Order> = vec![];let mut buy_list: BinaryHeap<Buy> = BinaryHeap::new();let mut sell_list: BinaryHeap<Sell> = BinaryHeap::new();let mut buy_amount_price = HashMap::new();let mut sell_amount_price = HashMap::new();buy_list.push(Buy {id: usize::MAX,amount: 0,price: 0,});sell_list.push(Sell {id: usize::MAX,amount: 0,price: 99999,});buy_amount_price.insert(0, 0);sell_amount_price.insert(99999, 0);let mut bvalid: Vec<bool> = vec![true; n];let mut buf = String::new();io::stdin().read_to_string(&mut buf).unwrap();let mut lines = buf.lines();for i in 0..n {let mut it = lines.next().unwrap().split_whitespace();let cmd = it.next().unwrap();let v: Vec<usize> = it.map(|x| x.parse().unwrap()).collect();if cmd == "CANCEL" {orders.push(Order {_id: i,amount: 0,price: 0,op: cmd.to_string(),});let cancel_id = v[0] - 1;let aorder = &orders[cancel_id];if aorder.op == "BUY" && bvalid[cancel_id] {if let Some(x) = buy_amount_price.get_mut(&aorder.price) {*x -= aorder.amount;}} else if aorder.op == "SELL" && bvalid[cancel_id] {sell_amount_price.entry(aorder.price).and_modify(|x| *x -= aorder.amount);}bvalid[cancel_id] = false;} else if cmd == "BUY" || cmd == "SELL" {let id = i;let amount = v[0];let price = v[1];let op = cmd.to_string();if cmd == "BUY" {buy_list.push(Buy { id, amount, price });buy_amount_price.entry(price).and_modify(|x| *x += amount).or_insert(amount);} else {sell_list.push(Sell { id, amount, price });sell_amount_price.entry(price).and_modify(|x| *x += amount).or_insert(amount);}let a = Order {_id: id,amount,price,op,};orders.push(a);}trade(&cmd.to_string(),&mut buy_list,&mut sell_list,&mut buy_amount_price,&mut sell_amount_price,&mut orders,&bvalid,);let price = buy_list.peek().unwrap().price;print!("QUOTE {} {}", buy_amount_price.get(&price).unwrap(), price);let price = sell_list.peek().unwrap().price;print!(" - {} {}", sell_amount_price.get(&price).unwrap(), price);println!();}
}fn trade(op: &String,buy_list: &mut BinaryHeap<Buy>,sell_list: &mut BinaryHeap<Sell>,buy_amount_price: &mut HashMap<usize, usize>,sell_amount_price: &mut HashMap<usize, usize>,orders: &mut Vec<Order>,bvalid: &Vec<bool>,
) {while buy_list.len() > 1 && sell_list.len() > 1 {let buy = buy_list.peek().unwrap();let sell = sell_list.peek().unwrap();if buy.price < sell.price {break;}if !bvalid[buy.id] {buy_list.pop();continue;}if !bvalid[sell.id] {sell_list.pop();continue;}let mut buy = buy_list.pop().unwrap();let mut sell = sell_list.pop().unwrap();let min_amount = buy.amount.min(sell.amount);orders[buy.id].amount -= min_amount;orders[sell.id].amount -= min_amount;buy.amount -= min_amount;sell.amount -= min_amount;buy_amount_price.entry(buy.price).and_modify(|x| *x -= min_amount);sell_amount_price.entry(sell.price).and_modify(|x| *x -= min_amount);if op == "BUY" {println!("TRADE {} {}", min_amount, sell.price);} else if op == "SELL" {println!("TRADE {} {}", min_amount, buy.price);}if buy.amount > 0 {buy_list.push(buy);}if sell.amount > 0 {sell_list.push(sell);}}//如果队首是被取消的订单while buy_list.len() > 1 {let buy = buy_list.peek().unwrap();if bvalid[buy.id] {break;}buy_list.pop();}while sell_list.len() > 1 {let sell = sell_list.peek().unwrap();if bvalid[sell.id] {break;}sell_list.pop();}
}

相关文章:

交易所(Exchange, ACM/ICPC NEERC 2006, UVa1598)rust解法

你的任务是为交易所设计一个订单处理系统。要求支持以下3种指令。 BUY p q&#xff1a;有人想买&#xff0c;数量为p&#xff0c;价格为q。 SELL p q&#xff1a;有人想卖&#xff0c;数量为p&#xff0c;价格为q。 CANCEL i&#xff1a;取消第i条指令对应的订单&#xff08;输…...

shell_51.Linux获取用户输入_无显示读取,从文件中读取

无显示读取 有时你需要从脚本用户处得到输入&#xff0c;但又不想在屏幕上显示输入信息。典型的例子就是输入密码&#xff0c;但除此之外还有很多种需要隐藏的数据。 -s 选项可以避免在 read 命令中输入的数据出现在屏幕上&#xff08;其实数据还是会被显示&#xff0c;只不过 …...

NOIP2023模拟2联测23 集训

题目大意 给定 n n n个数 a 1 , a 2 , ⋯ , a n a_1,a_2,\cdots,a_n a1​,a2​,⋯,an​&#xff0c;你需要找到一个集合 S S S&#xff0c;使得 S S S中严格大于 S S S的平均数的数字个数尽量多&#xff0c;输出最多的个数。 注意&#xff1a;这里的集合是可重集&#xff0c;…...

【设计模式】第3节:设计模式概论

设计模式不是代码&#xff0c;而是某类问题的通用方案。设计模式的本质是提高软件的维护性、通用性和扩展性&#xff0c;并降低软件的复杂度。一共有24种设计模式&#xff0c;可以分为创建型模式、结构型模式和行为型模式三大类。设计模式中比较重要的有&#xff1a;单例模式、…...

风力发电功率预测(CEEMDAN-LSTM-CNN-CBAM模型,Python代码)

1.前言 1.1.运行效果&#xff1a;风力发电功率预测&#xff08;CEEMDAN-LSTM-CNN-CBAM模型&#xff0c;Python代码&#xff09;_哔哩哔哩_bilibili 1.2.环境库&#xff1a; 如果库版本不一样&#xff0c; 一般也可以运行&#xff0c;这里展示我运行时候的库版本&#xff0c;是…...

精通代码复用:设计原则与最佳实践

精通代码复用&#xff1a;设计原则与最佳实践 在你开始设计的所有层次上&#xff0c;从单一函数、类&#xff0c;到整个库和框架&#xff0c;都需要从一开始就考虑到代码复用。在接下来的文本中&#xff0c;所有这些不同的层次都被称为组件。以下策略将帮助你合理地组织你的代…...

【static + 代码块+toString打印对象】

文章目录 static成员static修饰成员变量static成员变量初始化代码块 对象的打印写show方法打印对象调用toString打印对象 总结 static成员 举例&#xff1a;一个班的学生&#xff0c;在实例化每个人的名字&#xff0c;年龄&#xff0c;学号等学员信息时都不一样&#xff0c;但…...

【vue3 】 创建项目vscode 提示无法找到模块

使用命令创建 vue3 创建新应用 npm create vuelatest会看到一些可选功能的询问&#xff1f; √ 请输入项目名称&#xff1a; … vue-project √ 是否使用 TypeScript 语法&#xff1f; … 否 / 是 √ 是否启用 JSX 支持&#xff1f; … 否 / 是 √ 是否引入 Vue Router 进行单…...

盘点算法比赛中常见的AutoEDA工具库

在完成竞赛和数据挖掘的过程中&#xff0c;数据分析一直是非常耗时的一个环节&#xff0c;但也是必要的一个环节。 能否使用一个工具代替人来完成数据分析的过程呢&#xff0c;现有的AutoEDA工具可以一定程度上完成上述过程。本文将盘点常见的AutoEDA工具&#xff0c;欢迎收藏转…...

ICLR 2023丨3DSQA:3D 场景中的情景问答

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2210.07474.pdf 主页链接&#xff1a;http://sqa3d.github.io 图 1&#xff1a;3D 场景中情景问答 (SQA3D) 的任务图示。给定场景上下文 S&#xff08;例如&#…...

ChatGPT的前世今生:从概念到现实的AI之旅

ChatGPT的前世今生&#xff1a;从概念到现实的AI之旅 随着技术的飞速发展&#xff0c;人工智能已经从科幻小说中的概念转变为我们日常生活中不可或缺的一部分。其中&#xff0c;ChatGPT无疑是这个领域的佼佼者。那么&#xff0c;让我们一起探索ChatGPT的发展历程&#xff0c;从…...

MINA架构DEMO

参考&#xff1a;Java中的MINA框架_java mina_小陈拾光的博客-CSDN博客 MINA&#xff1a;一个简洁易用的基于TCP/IP通信的JAVA框架。 <dependency><groupId>org.apache.mina</groupId><artifactId>mina-core</artifactId><version>2.1.5&…...

Linux基础:2:shell外壳+文件权限

shell外壳文件权限 一.shell原理&#xff1a;1.对比&#xff1a;windo GUI 和 shell1.windo GUI2. shell 2.为什么&#xff1f;是什么&#xff1f;怎么办&#xff1f;1.为什么有shell2.是什么&#xff1f;3.怎么办&#xff1f;4.补充&#xff1a; 二.linux权限管理&#xff1a;…...

webpack 解决:TypeError: merge is not a function 的问题

1、问题描述&#xff1a; 其一、存在的问题为&#xff1a; TypeError: merge is not a function 中文为&#xff1a; 类型错误&#xff1a;merge 不是函数 其二、问题描述为&#xff1a; 想执行 npm run dev 命令&#xff0c;运行起项目时&#xff0c;控制台报错 TypeErro…...

datahub 中血缘图的实现分析,在react中使用airbnb的visx可视化库来画有向无环图

背景 做大数据的项目&#xff0c;必不可少的是要接触到数据血缘图&#xff0c;它在大数据项目中有着很重要的作用。 之前在公司也做过一些案例&#xff0c;也看过很多友商的产品&#xff0c;阿里的DataWork&#xff0c;领英的Datahub&#xff0c; datawork的血缘图使用的是 G6…...

二、判断语句

文章目录 1.if语句1&#xff09;if判断语句基本格式2&#xff09; 网吧上网3&#xff09;if语句使用逻辑运算 2.if-else语句1&#xff09;if-else的使用格式2&#xff09;网吧上网 3.多重判断elif语句1&#xff09; 多重判断elif2&#xff09;例子3&#xff09;注意点 4.if嵌套…...

龙智汽车行业客户案例:Jira数据中心版助客户解锁高效项目管理

龙智技术支持部负责人、Atlassian认证专家叶燕秀分享了她帮助某汽车企业落地Jira的故事&#xff0c;并详解了该公司选择Jira数据中心版的理由以及工具链的集成情况&#xff0c;为有同样需求的公司提供实践参考。 本文由叶燕秀口述内容整理而成 需求管理&#xff1a;从Excel表格…...

03 vi编辑器

vi编辑器的三种模式: 不同的模式下机键动作解释的意义是不一样的 编辑模式 插入模式 末行模式 文件的打开和关闭保存 移动光标...

Web界面自动化操作工具 - Selenium常见用法

Selenium是一个用于自动化浏览器操作的工具&#xff0c;常用于Web应用程序的测试和爬虫开发。 下面是一些Python Selenium的常见用法和代码示例&#xff1a; 1. 导入Selenium库和WebDriver&#xff1a; from selenium import webdriver2. 创建WebDriver实例&#xff1a; # …...

Openssl数据安全传输平台009:加密理论基础:哈希/非对称加密RSA/对称加密AES

文章目录 0. 代码仓库代码编译时候可能出现的错误 1. 哈希1.1 哈希算法的种类:1.2 使用的头文件1.3 哈希算法API1.3.1 详解md5 API1.3.2 sha1/sha224/sha256/sha384/sha512常用API 1.5 sha1代码测试1.4 在VS中添加预处理器定义1.5 哈希算法C代码封装的思路 2. 非对称加密RSA2.1…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...