问题描述
试题编号: 201412-3
试题名称: 集合竞价
时间限制: 1.0s
内存限制: 256.0MB
问题描述:
问题描述
  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。

  该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:

  1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。

  2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。

  3. cancel i表示撤销第i行的记录。

  如果开盘价为p0,则系统可以将所有出价至少为p0的买单和所有出价至多为p0的卖单进行匹配。因此,此时的开盘成交量为出价至少为p0的买单的总股数和所有出价至多为p0的卖单的总股数之间的较小值。

  你的程序需要确定一个开盘价,使得开盘成交量尽可能地大。如果有多个符合条件的开盘价,你的程序应当输出最高的那一个。
输入格式
  输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过108的正整数,出价为精确到恰好小数点后两位的正实数,且不超过10000.00。
输出格式
  你需要输出一行,包含两个数,以一个空格分隔。第一个数是开盘价,第二个是此开盘价下的成交量。开盘价需要精确到小数点后恰好两位。
样例输入
buy 9.25 100

buy 8.88 175

sell 9.00 1000

buy 9.00 400

sell 8.92 400

cancel 1

buy 100.00 50
样例输出
9.00 450
评测用例规模与约定
  对于100%的数据,输入的行数不超过5000。

解题思路:

这道题一直拿不了满分从0/30/40/50/90,心累

一道模拟题,暴力枚举,算出每个价格下的成交量取大值

我确定的价格的变化范围是卖出的最低价~买进的最高价之间,因为小于卖出的最低价或者大于买进的最高价都会使得成交量变成0,没有什么特别大的意义。

从低价格向上枚举。

注意:

刚开始以为会存在这样的情况:

存在一条删除命令 要删除买进或者卖出的股票

再来一条删除命令 要删除前面的删除命令/相当于前面的删除命令失效了

因为题目描述的不清楚,导致了我这样的幻觉~

去掉这部分代码之后就变成90分了。




源代码:
  1. <span style="font-size:18px;">#include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<string>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. struct node
  10. {
  11. int flag;//是否删除
  12. int bs;//买进还是卖出还是删除命令,1表示买进,-1表示卖出,0表示删除命令
  13. int price;//股票价格
  14. int number;//股票数量
  15. int index;//处于第几行命令
  16. int del;//要删除第几行的命令
  17. };
  18.  
  19. node ans[5005];
  20.  
  21. void init()
  22. {
  23. for(int i=0;i<5005;i++)
  24. {
  25. ans[i].flag=0;//表示不删除该命令
  26. ans[i].del=-1;//-1表示当前命令是b or s
  27. ans[i].bs=0;
  28. }
  29. }
  30.  
  31. int main()
  32. {
  33. char s[15];
  34. int k=1;//命令的位置
  35. int num;
  36. double pri;
  37. int order;
  38. init();
  39. while(scanf("%s",s)!=EOF)
  40. {
  41. if(s[0]=='b')//买进股票
  42. {
  43. scanf("%lf%d",&pri,&num);
  44. ans[k].bs=1;
  45. ans[k].index=k;
  46. ans[k].number=num;
  47. ans[k].price=(int)(pri*100);
  48. k++;
  49. }
  50. else if(s[0]=='s')//卖出股票
  51. {
  52. scanf("%lf%d",&pri,&num);
  53. ans[k].bs=-1;
  54. ans[k].index=k;
  55. ans[k].number=num;
  56. ans[k].price=(int)(pri*100);
  57. k++;
  58. }
  59. else if(s[0]=='c')//删除命令
  60. {
  61. scanf("%d",&order);
  62. ans[k].del=order;
  63. ans[k].index=k;
  64. int temp=order;
  65. ans[temp].flag=1;
  66. k++;
  67. }
  68. }
  69. int max_pri=0;
  70. int min_pri=0x3f3f3f3f;
  71. for(int i=1;i<k;i++)
  72. {
  73. if(ans[i].bs==1&&ans[i].flag==0)
  74. {
  75. if(ans[i].price>max_pri)
  76. max_pri=ans[i].price;
  77. }
  78. }
  79. for(int i=1;i<k;i++)
  80. {
  81. if(ans[i].bs==-1&&ans[i].flag==0)
  82. {
  83. if(ans[i].price<min_pri)
  84. min_pri=ans[i].price;
  85. }
  86. }
  87. long long ans_num=0;
  88. int ans_pri;
  89. for(int i=min_pri;i<=max_pri;i++)
  90. {
  91. long long pb=0;
  92. long long ps=0;
  93. for(int j=1;j<k;j++)
  94. {
  95. if(ans[j].bs==1&&ans[j].flag==0&&ans[j].price>=i)//买
  96. {
  97. pb+=ans[j].number;
  98. }
  99. else if(ans[j].bs==-1&&ans[j].flag==0&&ans[j].price<=i)//卖
  100. {
  101. ps+=ans[j].number;
  102. }
  103. long long temp=min(pb,ps);
  104. if(temp>=ans_num)
  105. {
  106. ans_pri=i;
  107. ans_num=temp;
  108. }
  109. }
  110. }
  111. double res_pri=(ans_pri*1.0)/100;
  112. printf("%.2lf %lld\n",res_pri,ans_num);
  113. return 0;
  114. }</span>


CCF-201412-3-集合竞价的更多相关文章

  1. CCF CSP 201412-3 集合竞价

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF CSP 201412-3 集合竞价 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确 ...

  2. ccf集合竞价

    我不懂为什么是错误.然后零分.贴出测试. 然后即使注释掉while循环中的break部分,也是如此. #include<iostream> #include<iomanip> ...

  3. CCF 集合竞价

    题目: 问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量. 该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种: 1. buy p s ...

  4. CCF计算机职业资格认证考试题解

    CCF计算机职业资格认证考试题解系列文章为meelo原创,请务必以链接形式注明本文地址 CCF计算机职业资格认证考试题解 CCF计算机软件能力认证(简称CCF CSP认证)是CCF计算机职业资格认证系 ...

  5. CCF认证历年试题

    CCF认证历年试题 不加索引整理会死星人orz 第一题: CCF201712-1 最小差值(100分) CCF201709-1 打酱油(100分) CCF201703-1 分蛋糕(100分) CCF2 ...

  6. CCF考试

    第八次CCF考试记录 代码还不知道对不对,过两天出成绩. 成绩出来了,310分. 100+100+100+10+0: 考试13:27开始,17:30结束,提交第4题后不再答题,只是检查前四题的代码 第 ...

  7. CCF关于NOIP2014复赛报名的通知

    CCF关于NOIP2014复赛报名的通知   CCF NOIP2014复赛全部实行网上注册.报名.未通过网上报名的选手将不具备参赛和申诉资格. 系统注册须知: NOIP2014复赛注册时间:2014年 ...

  8. [CCF] Z字形扫描

    CCF Z字形扫描 感觉和LeetCode中的ZigZag还是有一些不一样的. 题目描述 在图像编码的算法中,需要将一个给定的方形矩阵进行Z字形扫描(Zigzag Scan).给定一个n×n的矩阵,Z ...

  9. [CCF] ISBN号码检测

    CCF ISBN号码检测 题目概述 每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字.1位识别码和3位分隔符,其规定格式如"x-xxx-xxxxx-x",其 ...

  10. CCF NOI系列活动

    NOI-全国青少年信息学奥林匹克竞赛全国青少年信息学奥林匹克竞赛(NOI)是国内信息学领域内面向中学生的最高水平的大赛,每省派经选拔产生的选手(其中一名是女选手)参加,NOI每年在不同的省市举行. N ...

随机推荐

  1. spark的sparkUI如何解读?

    spark的sparkUI如何解读? 以spark2.1.4来做例子 Job - schedule mode 进入之后默认是进入spark job 页面 这个说明有很详细的解释,spark有两种操作算 ...

  2. git笔记------自己学习git的心得

    git个人学习总结: git是一个管理代码的版本控制系统,用git init创建一个git可以管理的仓库,这个仓库里有一个工作区,我们最基本的那些命令操作都是在工作区完成,在创建仓库的时候,在工作区里 ...

  3. 【唯星宠物】——CSS/BootStrap/Jquery爬坑之响应式首页

    前言:唯星宠物产品官网,分为首页.子页和登录注册页三个页面,除网页内容设计与图片素材的部分使用网上的材料之外,其余内容呈现以及功能模块全部为自己重构. 一.响应式轮播banner 思路:使用BootS ...

  4. Chartist.js-同时画柱状图和折线图

    最近几天都在研究chartist,因为echarts生成的图是位图,导成PDF的时候不够清晰.而chartist是搜到的免费插件中呼声较高的,基于SVG. 今天主要是想举一些代码例子给大家,介绍下如何 ...

  5. JavaWeb笔记一、Servlet 详解

    一.创建一个 Servlet 简单实现类 1.创建一个 HelloServlet 类(测试 Servlet 接口方法) 1 //创建一个 HelloServlet 类并实现 Servlet 接口 2 ...

  6. Nginx-动态路由升级版

    前几篇文章我们介绍了Nginx的配置.OpenResty安装配置.基于Redis的动态路由以及Nginx的监控. Nginx-OpenResty安装配置 Nginx配置详解 Nginx技术研究系列1- ...

  7. Spring各jar包作用及依赖

    先附spring各版本jar包下载链接http://repo.spring.io/release/org/springframework/spring/ spring.jar 是包含有完整发布模块的单 ...

  8. Appscan 配置中登录管理的问题

    一.登录录制时录制为空 这个问题出现在 9.0.3.5 版本上,当时同事一录制为空,我录制却ok,后来发现他录制前将谷歌浏览是打开状态,谷歌浏览关闭掉,再使用外部浏览器Chrome进行会话录制后,问题 ...

  9. Velocity(3)——#set指令

    引用可以让模板设计者生成动态内容,而指令允许设计者真正的负责页面的展现和内容. 指令是以#开头,后面紧跟一个关键字,比如if,else,foreach等.而这个关键字,是可以被放在{}中间的.这是规范 ...

  10. [转载] zookeeper工作原理、安装配置、工具命令简介

    转载自http://www.cnblogs.com/kunpengit/p/4045334.html 1 Zookeeper简介Zookeeper 是分布式服务框架,主要是用来解决分布式应用中经常遇到 ...