【链接】 我是链接,点我呀:)
【题意】

在这里输入题意

【题解】

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

【代码】

#include <bits/stdc++.h>
using namespace std;const int N = 1e4;struct abc {int num, price;abc(int x = 0, int y = 0) :num(x), price(y) {}
};abc re[N + 10];struct setcmp1
{bool operator () (const int &a, const int &b){if (re[a].price == re[b].price)return a < b;elsereturn re[a].price > re[b].price;}
};
struct setcmp2
{bool operator () (const int &a, const int &b){if (re[a].price == re[b].price)return a < b;elsereturn re[a].price < re[b].price;}
};set <int, setcmp1> buyset;//买的价格,越大越好
set <int, setcmp2> sellset;//卖的价格,越小越好
bool dele[N + 10];//用来记录某个交易是否被删除了。并不用时刻输出集合大小。所以只要遇到了把它删掉就Ok
int n;void cl()
{bool shan1, shan2;do{shan1 = shan2 = false;while (buyset.size() > 1 && dele[*buyset.begin()]) buyset.erase(buyset.begin()), shan1 = true;while (sellset.size() > 1 && dele[*sellset.begin()]) sellset.erase(sellset.begin()), shan2 = true;} while (shan1 || shan2);
}void out()
{int num1 = 0, num2 = 0;int price1 = re[*buyset.begin()].price, price2 = re[*sellset.begin()].price;for (auto it : buyset)if (re[it].price == price1){if (!dele[it]) num1 += re[it].num;}else break;for (auto it : sellset)if (re[it].price == price2){if (!dele[it]) num2 += re[it].num;}else break;printf("QUOTE %d %d - %d %d\n", num1, price1, num2, price2);
}int main()
{//freopen("F:\\rush.txt", "r", stdin);int kk = 0;while (~scanf("%d", &n)){if (kk > 0) puts("");kk++;re[N + 1].num = 0, re[N + 1].price = 0;re[N + 2].num = 0, re[N + 2].price = 99999;memset(dele, 0, sizeof dele);buyset.clear(); sellset.clear();buyset.insert(N + 1); sellset.insert(N + 2);for (int i = 1; i <= n; i++){char s[10];scanf("%s", s);switch (s[0]){case ('C'):{int x;scanf("%d", &x);dele[x] = true;cl();//看看队首是不是要删掉 out();break;}case ('B'):{//买进int num, price;scanf("%d%d", &num, &price);while (sellset.size() > 1 && num >0 && price >= re[*sellset.begin()].price){int temp = min(re[*sellset.begin()].num, num), temp2 = re[*sellset.begin()].price;num -= temp;re[*sellset.begin()].num -= temp;if (re[*sellset.begin()].num == 0){sellset.erase(sellset.begin());cl();}printf("TRADE %d %d\n", temp, temp2);}re[i] = abc(num, price);if (num != 0) buyset.insert(i);out();break;}case 'S':{//卖int num, price;scanf("%d%d", &num, &price);while (buyset.size() > 1 && num >0 && price <= re[*buyset.begin()].price){int temp = min(re[*buyset.begin()].num, num), temp2 = re[*buyset.begin()].price;num -= temp;re[*buyset.begin()].num -= temp;if (re[*buyset.begin()].num == 0){buyset.erase(buyset.begin());cl();}printf("TRADE %d %d\n", temp, temp2);}re[i] = abc(num, price);if (num != 0) sellset.insert(i);out();break;}default:break;}}}return 0;
}

转载于:https://www.cnblogs.com/AWCXV/p/7686073.html

【习题 5-14 UVA - 1598】Exchange相关推荐

  1. UVA 1598 Exchange

    这道题目难在阅读,翻译如下(第一段可以省略,从第二段开始) 订货薄会接收到一系列的消息,这些消息是订单或者是取消之前订单的请求.没有被取消的订单是激活状态的.订单类型分为购买订单和销售订单.每一个购买 ...

  2. 习题 5.14 输入n个字符串,把其中以字母A打头的字符串输出。

    C++程序设计(第三版) 谭浩强 习题5.14 个人设计 习题 5.14 输入n个字符串,把其中以字母A打头的字符串输出. 代码块: #include <iostream> #includ ...

  3. 14行代码AC——习题5-4 交换学生(Foreign Exchange, UVa 10763)——解题报告

    励志用少的代码做高效的表达 题目(提交)链接→UVa-10763 本题为水题,因此侧重点由解题转向优化. 题意:判断第一列的数字是否与第二列的数字相同(乱序).解题方向多样,值得探究: 1.map哈希 ...

  4. c语言读文件一行为一个数组元素,c语言数组练习习题(14页)-原创力文档

    第 7章 数组习题 A 卷 1. 单项选择题 (1) int a[4]={5,3,8,9}; 其中 a[3] 的值为 (D ) . DA.5B.3C.8D.9 以下 4 个字符串函数中, ( A) 所 ...

  5. C++ Primer(第四版) 课后习题3.14 vector单词转大写

    问题: 读入一段文本到 vector 对象,每个单词存储为 vector  中的一个元素.把 vector对象中 每个单词转化为大写字母.输出 vector 对象中转化 后的元素,每 8 个词为一行输 ...

  6. 谭浩强c语言课后习题笔记[1-4章]

    c语言程序设计(第五版)谭浩强课后习题笔记 文章目录 c语言程序设计(第五版)谭浩强课后习题笔记 第一章 程序设计和c语言 1.4 打印 Hello World 1.6 输入abc求最大值 第二章 算 ...

  7. c++ primer 5th 习题11.14自己编写的答案

    文件 1.cc #include <string> #include <iostream> #include <fstream> #include <list ...

  8. 习题3-11 Kickdown UVA - 1588

    不知道是我把题意理解错了还是题目出错了,我觉得,在题目的要求之下,如果能够反转其中一块板,那么会得到更短的长度.但是测试数据表明不需要反转板. 刚开始写怎么写都写不对,因为对相交部分的考虑不够细致,处 ...

  9. 走台阶 OR 台阶走——《狂人C》习题解答14(第三章习题4)

    题目: 4. 有一段楼梯有6级台阶,规定每一步只能跨一级或两级,要登上第6级台阶有几种不同的走法? 这个题目从数学角度来看可能有一点难度,但一经点破也就没什么难度了.      首先第1级台阶只有一种 ...

最新文章

  1. [ZJOI2008][BZOJ1036] 树的统计count
  2. Java 9 –终极功能列表
  3. seaborn绘图入门1(lineplot+barplot+heatmap+scatterplot)
  4. matlab中变.,Matlab变系数微分方程
  5. Hive分区表count(*)不起mapreduce的真相
  6. 将一副完整的位图均分成n块位图显示
  7. python怎么输出键值对_python 获取字典键值对的实现
  8. 加权平均法和移动加权法的例题
  9. 打印机 树莓派安装cpus_raspberry树莓派安装CUPS实现打印服务器共享HP P1007打印机...
  10. java面试 socket_java网络编程面试题
  11. 3D建模就业前景如何?
  12. 【Python框架】Scrapy简单入门及实例讲解
  13. 工业级手持式扫描仪3d扫描首选迪万科技抄数服务
  14. html 实现动态在线预览word、excel、pdf等文件(方便快捷)
  15. 喷射计算机故障,电子燃油喷射系统常见故障
  16. 鸿蒙OS到底是不是Android套皮?(少bb,看源码!)
  17. 如何在时间序列预测中检测随机游走和白噪声
  18. 谱聚类(spectral clustering)
  19. 利用MUI+个推实现APP消息推送
  20. C++标准库(第二版,作者_NicolaiMJosuttis)_第六章标准模板库_概述

热门文章

  1. 计算机重装系统知识,电脑重装系统基础知识扫盲贴
  2. mysql索引与约束有什么关系_MySQL 约束与索引
  3. python修改类的属性值_python 四种方法修改类变量,实例对象调用类方法改变类属性的值,类对象调用类方法改变类属性的值,调用实例方法改变类属性的值,直接修改类属性的值...
  4. 【uni-app】在新窗口中打开链接
  5. 【若依(ruoyi)】swagger 接口 @SessionAttribute 修饰的参数
  6. Eclipse 打开文件出现乱码情况总结
  7. 【H2 Database】导出CSV
  8. uboot修改linux源码中参数,将自定义参数从uboot传入kernel的并读取的方法【转】
  9. win10弹不出密码输入框_电脑互访提示输入网络密码,怎么办?
  10. java对象赋值_Java 对象不使用时为什么要赋值为 null?