紫书第五章习题 5-14 UVa1598-Exchange

uva1598(大模拟+优先队列) 思路:照着模拟就行 坑点:一个订单可能会被删除多次,还有一个点。。。优先队列的top函数,返回的是一个copy。。。 代码如下: /* */ #define LOCAL #include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<... 阅读详情

出处:https://blog.youkuaiyun.com/zju2016/article/details/75005098

题目链接:https://vjudge.net/contest/231030#problem/N

    #include<iostream>  
    #include<vector>  
    #include<string>  
    #include<type_traits>  
    #include<sstream>  
    #include<tuple>  
    #include<bitset>  
    #include<regex>  
    #include<set>  
    #include<stack>  
    #include<queue>  
    #include<map>  
    #include<algorithm>  
    using namespace std;  
      
    map<int, set<int>> Buy;//映射:购买价格到购买的指令编号  
    map<int, int> Buy_total;//映射:购买价格到购买总量  
    map<int, set<int>> Sell;//映射:卖的价格到卖的指令编号  
    map<int, int> Sell_total;//映射:贩卖价格到贩卖总量  
    typedef struct command{  
        string com;  
        int price, amount;  
        int id;  
    }command;  
      
    vector<command> Com;//存储指令  
      
    void Deal(int flag){//处理"TRADE"  
        while (!Buy.empty()&&!Sell.empty()){  
            if (Buy.rbegin()->first>=Sell.begin()->first){  
                set<int>& v1 = Buy.rbegin()->second;  
                set<int>& v2 = Sell.begin()->second;  
                int number1 = *v1.begin();  
                int number2 = *v2.begin();  
                int size = min(Com[number1].amount,Com[number2].amount);  
                Com[number1].amount -= size;  
                Com[number2].amount -= size;  
                Buy_total[Com[number1].price] -= size;  
                Sell_total[Com[number2].price] -= size;  
                cout << "TRADE " << size << " " << (flag ? Com[number1].price : Com[number2].price)<<endl;  
                if (Com[number1].amount == 0) v1.erase(number1);  
                if (Com[number2].amount == 0) v2.erase(number2);  
                if (Buy_total[Com[number1].price] == 0) Buy_total.erase(Com[number1].price);  
                if (Sell_total[Com[number2].price] == 0) Sell_total.erase(Com[number2].price);  
                if (v1.size() == 0) Buy.erase(Com[number1].price);  
                if (v2.size() == 0) Sell.erase(Com[number2].price);  
            }  
            else{  
                return;  
            }  
        }  
    }  
      
    void Print(){//处理"QUOTE"  
        cout << "QUOTE ";  
        if (Buy_total.size() == 0) cout << "0 0 - ";  
        else{  
            cout<<Buy_total.rbegin()->second<<  " " <<  Buy_total.rbegin()->first << " - ";  
        }  
        if (Sell_total.size() == 0) cout << "0 99999" << endl;  
        else cout <<Sell_total.begin()->second << " " << Sell_total.begin()->first <<  endl;  
    }  
      
    int main(){  
        int Case = 0;  
        int n;  
        while (cin >> n){  
            Buy.clear();  Buy_total.clear();  
            Sell.clear(); Sell_total.clear();  
            Com.clear();  
            if (Case++) cout << endl;  
            for (int i = 0; i < n; i++){  
                command temp;  
                cin >> temp.com;  
                if (temp.com == "BUY"){  
                    cin >> temp.amount >> temp.price;  
                    Buy[temp.price].insert(i);  
                    Buy_total[temp.price] += temp.amount;  
                    Com.push_back(temp);  
                    Deal(0);  
                }  
                else if (temp.com=="SELL"){  
                    cin >> temp.amount >> temp.price;  
                    Sell[temp.price].insert(i);  
                    Sell_total[temp.price] += temp.amount;  
                    Com.push_back(temp);  
                    Deal(1);  
                }  
                else{  
                    int id;  
                    cin >> id;  
                    id--;  
                    temp.id = id;  
                    Com.push_back(temp);  
                    int price = Com[id].price;  
                    if (Com[id].com == "BUY"){  
                        Buy[price].erase(id);  
                        Buy_total[price] -= Com[id].amount;  
                        if (Buy[price].empty()) Buy.erase(price);  
                        if (Buy_total[price] == 0) Buy_total.erase(price);  
                        Com[id].amount = 0;  
                    }  
                    if(Com[id].com=="SELL"){  
                        Sell[price].erase(id);  
                        Sell_total[price] -= Com[id].amount;  
                        if (Sell[price].empty()) Sell.erase(price);  
                        if (Sell_total[price] == 0) Sell_total.erase(price);  
                        Com[id].amount = 0;  
                    }  
                }  
                Print();  
            }  
        }  
        return 0;  
    }  

UVa 1598 Exchange 翻译+解题 这个题目巨长,而紫书上的描述巨简单,但是看了题目的样例之后,心中mmp,这踏马什么玩意,怎么输出还能是这样。看了原题的输入输出细节之后,只想说,这哪跟哪啊,啥都看不懂。这下只能看原题了。(英语还没过四级,,因为还没考,,,,翻译的烂请谅解) 第一段就不翻译了,因为没啥信息。 这个有一个订货簿啊(后面就用本子代替了啊),它记录着一些订单,还有取消订单的记录啥的。这种没有被取消的订单被称为 act 阅读详情

相关推荐

UVA 1598 Exchange

这道题目难在阅读,翻译如下(第一段可以省略,从第二段开始)        订货薄会接收到一系列的消息,这些消息是订单或者是取消之前订单的请求。没有被取消的订单是激活状态的。订单类型分为购买订单和销售订单。每一个购买订单或者是销售订单有两个正数的变量size和price。订货薄保持了一系列激活状态的订单列表,并且产生quote(报价)和trades(交易)。激活状态的购买订单中价格最高的是最优购买

zju2016的博客 1658

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

GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 AC代码 有意思的一个题目。书上说这是一个不错的优先队列练习题,但实际上它其实是一个让我们了解优先队列有哪些限制的题目。 其他同学的很多题解因为优先队列限制太大,转而使用了map等结构作为优先队列的代替。我这里还是使用的优先队列。 这个题目碰到的优先队列的限制有: 1. 不能清空优先队列,无法clear 2. 不能遍历,只能查看堆顶元素 3. 默认是大顶堆,自行改变判断规则有些麻

Coding home - 漂流瓶jz 1339

全球半导体设备氧化钇熔射服务行业规模预测:预计未来六年CAGR为7.8%

本文将对“半导体设备氧化钇熔射服务”行业进行深度分析,探讨市场趋势的演变、核心竞争者的战略布局、供应链结构的内外特点、研发创新的最新进展、法规政策环境的适应性调整以及投资机会与风险评估。这一稳健的增长趋势表明半导体设备氧化钇熔射服务在电子行业中的重要性逐渐增强。由于全球对于高效、高精度和可靠的电子解决方案的需求增加,对能够提供这些功能的半导体设备氧化钇熔射服务的需求日益增长。由于半导体设备氧化钇熔射服务主要为就地服务型,其“配送”主要依赖于专业团队和技术设备的及时调配,强调服务的时效性和高质量。

CC1239777的博客 570

紫书UVa1598

#include <vector> #include <map> #include<algorithm> #include<cmath> #include<vector> #include<cstdio> #include <sstream> #include<iostream> #include<iomanip> #include<stack> #include<set> .

weixin_46273288的博客 228

热测试芯片(TTC)在ASIC热设计中的关键作用与应用

热测试芯片(TTC)是半导体热管理领域的重要工具,通过物理仿真技术精确测量芯片温度分布。其核心原理是利用金属膜电阻和二极管传感器阵列,实现微米级空间分辨率和毫秒级动态响应。在工程实践中,TTC能有效预防热岛效应、优化散热设计,特别适用于AI加速芯片、3D堆叠封装等先进半导体器件。相比传统热仿真软件,TTC提供更真实的温度数据,帮助工程师在流片前发现潜在热问题。随着1mm微型单元技术的突破,TTC已能检测0.3mm²微小区域的热变化,满足GaN/SiC等宽禁带半导体器件的测试需求。

weixin_33688840的博客 508

Java实现双色球&大乐透随机选号算法——原理详解与代码实战

掌握核心语法:集合操作、随机数生成、排序。贴近实际场景:将编程知识应用于生活问题的解决。

wangchl0932的博客 4974

UVA ~ 1598 ~ Exchange (优先队列 + 模拟)

题意:你的任务是为交易所设计一个订单处理系统。要求支持以下3种指令。□ BUY p q:有人想买,数量为p,价格为q□ SELL p q:有人想卖,数量为p,价格为q□ CANCEL i:取消第i条指令对应的订单(输入保证该指令是BUY或者SELL)交易规则如下: 对于当前买订单,若当前最低卖价(ask price) 低于当前出价,则发生交易;对于当前卖订单,若当前最高买价(bid price)高...

张松超的博客 647

UE4_用户控件_6_通过控件蓝图内部变量来修改进度条的值

发现控件类图类的引用和用户控类引用不兼容,修改变量类型。我们需要添加到视口,同时设置输入模式。创建按钮的点击事件,当点击时调用角色的自定义事件clearwidget。可以了,但是没有退出控件,没有鼠标,所以改进一下。

Growthofnotes的博客 1236

【习题 5-14 UVA - 1598】Exchange

【链接】 我是链接,点我呀:) 【题意】 在这里输入题意 【题解】 各组数据之间有空行! 且最后一行后面没有空行! 然后就是用set来模拟就好。 删除的时候,不着急删除。 因为并不用时刻输出集合大小。所以只要遇到了把它删掉就Ok. 把相同的合并那里。我直接暴力合并了。 因为 150 30 100 30 不能看出一个整体的250 30的。。 要分步输出Trade信息的. 然...

weixin_30536513的博客 99

Halcon 形态学 开发案例 (开运算opening(先腐蚀再膨胀)、闭运算closing(先膨胀再腐蚀))

算子方法:功能:使用用户自定义的结构元素对区域进行开运算参数: Region(输入参数) :输入区域 StructElement(输入参数) :结构元素(区域) RegionOpening(输出参数) :开运算后的区域功能:使用圆形结构元素对区域进行开运算参数: Region(输入参数) :输入区域 RegionOpening(输出参数) :开运算后的区域 Radius(输入参数) :圆形结构元素的半径功能:使用矩形结构元素对区域进行开运算。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1618

神经进化实践:用遗传算法替代反向传播优化神经网络

神经进化用来定义应用于深度学习的特定优化模式。在本节中,我们通过遗传算法优化简单深度学习网络的权重/参数,替换在误差反向传播训练过程中的所用优化器。

盼小辉丶的博客 3612

Uva - 1598 - Exchange

本来想用优先队列做,可是不知道怎么处理之间的关系,最后还是用了map方法AC了,不过速度上有些慢,提交的时候跑了1.557秒。估计这道题时间都稍微长些,题目的时间限制也是4.5秒,不像一般题目的3秒限制。 AC代码: #include <iostream> #include <cstdio> #include <cstdlib> #...

anpi3191的博客 218

AI智能体丨使用Coze一键生成中式养生视频,39 条作品涨粉 37.9 万!(附保姆级教程)

本文介绍如何利用扣子(Coze)AI智能体工作流高效制作中式养生短视频。该方案通过AI自动生成养生文案、古风插画素材、语音合成和视频剪辑,将传统制作流程从2-3小时缩短至1-2分钟。工作流包含文案创作、音频生成、图片素材制作和视频合成四大模块,采用大模型处理各环节内容,最终输出可直接导入剪映的草稿文件。特别适合希望快速批量制作文化氛围感强、兼具干货与视觉效果的养生内容创作者,效率提升近百倍。

李同学Lino的博客 3027

习题5_14 uva1598交易所(想看题意搓进来)

说声抱歉,这题写的代码有点乱,所以后面有时间再改,虽然AC了 先讲思路,防止以后自己忘了… 这题主要题意为多组数据,每次很多交易记录,如果此时买的时候,发现有比他内心价格还低的价格,就买,卖的时候,发现有比他心中价格高的,就卖,如果没买完或者卖完,放着剩下的等待, 如果在买或者卖之时,发现有人出价相同,那么编号在前的先来(防止打打杀杀)。 如果还有一个是废除编号第几的命令(保证只废除买或者卖的),...

qq_37548017的博客 293

嵌入式模拟电路面试题大全及参考答案(持续更新)

高输入阻抗:由于晶体管的基极-发射极(BJT)或栅极-源极(MOSFET)电压很低,跨导放大器具有很高的输入阻抗。低输出阻抗:晶体管的集电极-发射极或漏极-源极电阻较低,提供较低的输出阻抗。电压控制:输入信号控制晶体管的跨导,从而控制输出电流。晶体管:作为放大器的核心,可以是BJT或MOSFET。偏置电路:为晶体管提供稳定的工作点,确保其在放大区域内工作。负载电阻:与晶体管的集电极或漏极连接,将电流转换为电压。晶体管的选择:根据所需的增益、速度和功率消耗选择合适的晶体管。偏置稳定性。

大模型大数据攻城狮的专栏 988

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

void的博客 708

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

UVA - 1598 Exchange

/* 法一借鉴自: http://blog.youkuaiyun.com/xienaoban/article/details/52818530 这题的特点和注意点,在上面的博客的解析中,已经说得十分详细了 */ #include <iostream> #include <map> #include <set> #inc...

weixin_30657541的博客 211

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

[JZOJ1598]文件修复

Description有一个文件被破坏了,可是值得庆幸的是,只是文件的顺序被打乱了。文件仅包含大小写的拉丁字母以及逗号,句号和叹号。为了尽快修复,请你找出有多少个至少出现两次的子串。 比如字符串abbabc,子串”a”,”b”,”ab”分别出现了2次,3次,2次。Solution这是一道SASA的题目对于排好序的每个后缀 abbabc abc babc bbabc bc c 做到第ii个后缀时,我

Never give in. 935

[刷题]算法竞赛入门经典(第2版) 5-14/UVa1598 - Exchange

题意:模拟买卖,当出售价bid等于或低于出售价ask,则交易。 代码:(Accepted,0.330s) //UVa1598 - Exchange //Accepted 0.330s //#define _XIENAOBAN_ #include<functional> #include<algorithm> #include<iostrea...

weixin_30412013的博客 201

UVA1598

思路:每个优先级队列分别存储sell和buy,每个指令后都判断是否产生交易 package test; import java.util.Comparator; import java.util.Iterator; import java.util.PriorityQueue; import java.util.Queue; import java.util.Scanner; import j

crazychen的专栏 1417

Uva 10820

比较简单的一道题目,思路和紫书一致,求出欧拉函数的值,求和乘2加1即可,具体实现见如下代码: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace s

zju2016的博客 340

类的继承:人,学校,学生,老师,班主任!

定义一个普通人、老师、班主任、学生、学校, 提供适当的filed、方法用于描述其内部数据和行为方式, 并提供主类使之运行。要求有良好的封装性, 将不同的类放在不同的包下面,增加文档注释

zhuangxioqiang的博客 3578

A Plug for UNIX UVA - 753(方法一)

题目考察的是最大流的问题,将插座和设备抽象为顶点,利用转换器的信息以及floyd算法来判断哪些类型的设备能够转换为哪些类型的插座,然后建立相应的图,注意这时候图的每条边上的容量是不限,也就是满足题目中的转换器的个数可以为任意个,然后建立一个起点和一个终点,从起点到各个设备建立相应的边,每条边上的容量为1表示我们要考虑的每种类型的设备个数仅仅为1个,再建立从插座到终点的相应的边,每条边的容量为1,理

zju2016的博客 234

UVa-1598-Exchange

用两个map>,greater>,map>,less>分别保存buy信息和sell信息,其中key是价格,每个pair是一条信息。pair.first是信息序号,pair.second是数量。map>用来指示某个序号的信息是buy还是sell,并且保存相应的价格。每从输入获取一条信息,如果是buy,则检查sellInfo中的最小价格是否低于此条buy信息的价格,若是,则进行交易,直到有一方size

zay999abc的博客 1237

uva 409 poj 1598

uva 409和poj 1598是同一道题。这道题也算是基础题了,主要有两点需要注意 1. A keyword "occurs" in an excuse if and only if it exists in the string in contiguous form and is delimited by the beginning or end of the line or any non

菜鸟只能慢慢练 833

uva10462-(带重边次小生成树)

题解:次小生成树,不过这次带重边,那么可以用邻接表存数据,然后判断一下是不是prim算法里面的那条接上去边即可 #include #include #include #include #include using namespace std; const int inf = 0x3f3f3f3f; const int mx = 1e3+5; typedef pair P; #define

Soul 588
上一篇: 紫书第五章习题 5-13 UVa822-Queue and A
下一篇: 例题8-1 Stacks of Flapjacks
JXUFE_ACMer
博客等级 码龄9年 20粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值