CCF 201412-3 集合竞价 90分代码 C++

【ccf2014-12-03】集合竞价 题目内容 问题描述 试题编号: 201412-3 试题名称: 集合竞价 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:   1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。   2... 阅读详情

问题描述
  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。
  该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:
  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。
90分代码:
思路:买价大于等于售价才能成交,题目就是求个最佳的阈值,使得成交量最高。
先把所有数据存在一个大数组中,去掉cancel的行之后,在把数据分到buy和sell数组。求最大成交量的时候,分别根据价格进行排序,从buy中选最好的开盘价(因为成交量相同的情况下要求选开盘价高的),buy从后往前遍历,记录大于某个价格的买者股数,同时在sell中从前往后记录售价小于买价的总售卖股数,实际的成交量为两者中较小的,依次循环,找到使得成交量最大的价格,即定为开盘价。
明明跟那个100分代码快一模一样了,还是90,硬生生看了几个小时后,暂时放弃……太打击人了……第三题注定是无法完整的……

#include <iostream>
#include <algorithm>
#include <string>
#include <iomanip> 
using namespace std;//用string之前一定要声明名称空间 
struct record{
	string str;
	double price;
	long long num;
}; 
bool cmp(record r1,record r2)
{
	return r1.price<r2.price;
}
int main()
{
	record buy[5001],sell[5001],total[5001];
	int num[5001]={0};
	record temp;
	int del;
	double ans_price=0;
	long long ans_num=0;
	int n=1;
	
	//因为有需要删除的行,所以先把所有的行先接收到  
	//一个大数组中,便于以后分类和去除被删除行 
	while(cin >> total[n].str)
	{
		if(total[n].str=="buy"||total[n].str=="sell")
		{
			cin >> total[n].price >> total[n].num;	
		}
		else if(total[n].str=="cancel")
		{
			cin >> del;
			num[del]=1;
		}	
		n++;
	}
	//分类到buy和sell 
	int m=0,k=0;
	for(int s=1;s<n;s++)
	{
		if(num[s]==0)
		{
			if(total[s].str=="buy")  buy[m++]=total[s];
		    else sell[k++]=total[s];
		}
	}
	sort(buy,buy+m,cmp);
	sort(sell,sell+k,cmp);
	//遍历,比较得出使得开盘成交量尽可能地大的开盘价
	//系统可以将所有出价至少为p0的买单和所有出价至多为p0的卖单进行匹配。
    //开盘成交量为出价至少为p0的买单的总股数和所有出价至多为p0的卖单的总股数之间的较小值。 
    long long numb=0,nums=0,min_num=0;
	for(int i=m-1;i>=0;i--)
	{
		numb+=buy[i].num;//累加,大于等于当前buy[i].price的股票数 
		nums=0;//注意每一轮要置成0 
		for(int j=0;j<k;j++)
		{
			if(buy[i].price<sell[j].price)
			     break;
			nums+=sell[j].num;
		}
		if(numb<nums) min_num=numb;
		else min_num=nums;//开盘成交量为两者中较小值 
		if(min_num>ans_num)//使得开盘成交量最大的开盘价 
		{
			ans_num=min_num;
			ans_price=buy[i].price;			
		}
	} 
	cout << setiosflags(ios::fixed) << setprecision(2) << ans_price << " ";
	cout << ans_num << endl;	 
	cout<<endl;
	return 0;
} 

100代码:

/*201412-3集合竞价
问题描述
  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。
  该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:
  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。
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
struct Record
{
	string a;
	double p;
	long long s;
};
Record buy[5001],sell[5001],record[5001];
int num[5001]= {0};
int b=0,s=0;
long long numb=0,nums=0;
long long mm;
long long mins=0;
double minp=0;
int main()
{
	int n=1;
	while(cin>>record[n].a)
	{
		if(record[n].a!="cancel")
		{
			cin>>record[n].p>>record[n].s;
			n++;
		}
		else
		{
			int del;
			cin>>del;
			num[del]=1;
			n++;
		}
	}
	for(int i=1; i<n; i++)
	{
		if(num[i]==0)
		{
			if(record[i].a=="buy")
			{

				buy[b].a="buy";
				buy[b].p=record[i].p;
				buy[b].s=record[i].s;
				b++;
			}
			else
			{
				sell[s].a="sell";
				sell[s].p=record[i].p;
				sell[s].s=record[i].s;
				s++;
			}
		}
	}
	for(int i=0; i<b; i++)
	{
		for(int j=i+1; j<b; j++)
		{
			if(buy[i].p>buy[j].p)
			{
				swap(buy[i].p,buy[j].p);
				swap(buy[i].s,buy[j].s);
			}
		}
	}
	for(int i=0; i<s; i++)
	{
		for(int j=i+1; j<s; j++)
		{
			if(sell[i].p>sell[j].p)
			{
				swap(sell[i].p,sell[j].p);
				swap(sell[i].s,sell[j].s);
			}
		}
	}
	for(int i=b-1; i>=0; i--)
	{
		numb+=buy[i].s;
		nums=0;
		for(int j=0; j<s; j++)
		{
			if(buy[i].p<sell[j].p)
				break;
			nums+=sell[j].s;
		}
		mm=min(numb,nums);
		if(mm>mins)
		{
			mins=mm;
			minp=buy[i].p;
		}
	}
	printf("%.2lf %lld",minp,mins);
	cout<<endl;
	return 0;
}
CCF集合竞价 问题描述   某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:   1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。   2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。   3. cancel i表示撤销第i行的记录 阅读详情

相关推荐

jOpenExchg 更新了集合竞价代码

NULL 博文链接:https://ganmomopian.iteye.com/blog/2068294

CCF 集合竞价 (满分代码 + 解题思路 + 技巧总结)201412 - 3

技巧总结 当需要一对数据取最值时,不一定需要用pair进行存储(比较繁琐),利用两个变量维护当前最值 要注意数据范围是否会爆int 所有数据定义时一定不要忘记初始化 题目描述 解题思路 数据范围不大只有5000, 所以可以选择用暴力n*2解决 由于题目中指出相同的开盘成交量,选取较高的开盘价,所以枚举的价格应该是题目中给出的价格,因为如果你取题目中出现的两个价格的中间的值,则同样的开盘成交量的最高开盘价必定是已经给出的价格 题目的意思言简意赅就是,对于一个给定价格p,计算买进价格 >= p

一只可爱的小猴子的博客 2468

Bioconductor核心包(GO.db等)安装失败排查指南:从版本冲突到网络优化

本文详细解析了Bioconductor核心包(如GO.db)安装失败的常见原因及解决方案,包括版本冲突、网络问题和依赖关系。通过版本检查、镜像配置和依赖管理等方法,帮助用户高效解决安装难题,提升R语言生物信息学分析的工作效率。

weixin_29066781的博客 426

【CCF CSP-20141203】集合竞价

【CCF CSP-20141203】集合竞价

我真的不是cjcの博客 384

双重机器学习 stata教程 手把手教学

双重机器学习(DDML)的stata教程

weixin_59030591的博客 1万+

DRV8711驱动器的各寄存器的介绍

drv8711驱动器

PCLintelligence的博客 1634

CCF201412-3 集合竞价

问题描述   某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种: buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。 sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。 cancel i 表示撤销第i行的记录。   如果开盘价为p0,则系统可以将所有出...

Keep eating codes! 385

基于Simulink进行步进电机的重复控制仿真建模

重复控制概述目的:通过引入一个周期延迟环节来补偿系统的周期性误差,从而提高系统对周期性参考信号或扰动的跟踪性能。方法内部模型原理:在控制器中嵌入一个与周期性信号相关的模型(例如周期延迟环节),以实现对周期性误差的零稳态误差控制。滤波器设计:为了避免高频噪声放大,通常会在重复控制器中加入低通滤波器。优势对周期性信号具有良好的跟踪性能。不需要精确的数学模型即可实现高性能控制。挑战:需要合理设计重复控制器的参数以避免系统不稳定。

amy_mhd的博客 268

CCF-201412-3(集合竞价)

一:问题描述 1.问题描述 某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:   1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。   2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。   3. cancel i表示撤销第i行的记...

Sunflower的博客 509

innovus:streamOut gds中pg text带有冒号(:)解决办法

streamOut后查看layout,发现部分PG text后面加了冒号,比如VDD: / VSS:。当然,这个问题还有另一种解决办法,就是通过脚本给terminal打text再streamOut。我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?

m0_61544122的博客 1190

【人工智能时代】- 一键部署本地AI大模型

Ollama是一个开源项目,致力于简化大型语言模型(LLM)的本地部署过程。它允许用户在自己的硬件上运行和测试最新的语言模型,无需依赖云服务。Ollama提供了一个类似于OpenAI的API接口,使得开发者可以轻松地在自己的应用程序中集成大型语言模型。此外,Ollama WebUI为用户提供了一个友好的界面,用于管理和与模型进行交互。

xiaoli8748的专栏 2383

ccf201412-3集合竞价

问题描述某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:   1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。   2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。   3. cancel i表示撤销第i行的记录。   如果

m0_38116428的博客 531

芒果YOLOv5改进05:损失函数IoU 篇之Repulsion Loss:原创改进损失函数 Repulsion:解决目标遮挡场景下检测,为解决密集人群检测中遮挡设计的损失函数,打造高效检测器涨点

YOLOv5改进代码实践|结合Repulsion 解决目标遮挡场景下检测🚀

包括YOLOv5、YOLOv7、YOLOv8等模型改进 4565

CCF计算机软件能力认证试题: 201412-3 集合竞价

#include<iostream> #include<stdlib.h> #include<string> #include<vector> #include<algorithm> #include<stdio.h> using namespace std; #define MAX 5002 typedef long l...

A315776的博客 375

YOLO十年演进:从CNN到Transformer再到MoE,我看懂了2026年目标检测的落地风向标

技术永远是为业务服务的,能解决真实问题的技术,才是有价值的。YOLO的十年演进,从CNN到Transformer再到MoE,从来都不是学术上的炫技,而是一步一步解决工业落地的痛点:从让实时检测成为可能,到解决复杂场景的漏检误检,再到打破精度和算力的死局,每一步都踩在了工业落地的真实需求上。很多新入行的朋友,总喜欢追新,今天换Transformer,明天堆MoE,觉得模型越新、参数越大,就越厉害。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 748

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

CCF认证历年试题解【网上跟帖,请不要使用称呼】

程序改变现实,软件统治世界。 程序员需要有精益求精的工匠精神,追求逻辑的极简、时间的最少和存储的最省,并且懂得其中的平衡。 数据表示需要优先考虑,对于许多问题,找到表示该问题的数据结构,问题自然就解决了。 CCF计算机职业资格认证的每一道试题都十分经典,覆盖现实世界中方方面面的问题。这个历年试题解全部用C++语言编写,程序中附有注释,力求解题思路清晰简洁,值得珍...

weixin_33971205的博客 294

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

集合竞价匹配量,未匹配量,竞价量,竞价金额计算

集合竞价数据的计算: 数据来自qmt,后面附代码 匹配价格:lastPrice   竞价涨幅:(lastPrice/lastClose -1)*100 竞价量:askVol 卖1的量 askVol[0] 竞价金额:竞价量*匹配价格 未匹配量:abs(sum(askVol)-sum(bidVol)) 委卖和委买量差的绝对值

lianquant的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

CCF-集合竞价(开盘价定为买价,1e8*5000--long long)

问题描述  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。 该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种: 1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。 2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。 3. cancel i表示撤销第i行的记录。 如果开盘价为p0,则系统可以...

hey_dom2016的博客 483

ccf往年真题-集合竞价

问题描述   某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:   1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。   2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。   3. cancel i表示撤销第i行的记录。   如果...

sunandstarws的博客 1016

ccf-201412-3 集合竞价(详解)

ccf-201412-3 集合竞价(详解) 试题编号: 201412-3 试题名称: 集合竞价 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述   某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种...

Yanareat的博客 4750

CCF-201412-3-集合竞价

这道题不算是模拟,算数学题吧。这道题也是要细心。 思路 定的开盘价要使得买单和卖单的成交量最大就是尽可能多的把买单和买单进行匹配。成交量就是买单数和卖单数的最小值。 如图 从buy买价开始找开盘价,每一个开盘价,从开盘价往上求出总买单数,往下找出总卖单数,找买卖单最小值,更新最大卖单数。 注意 为什么要从买单开始找开盘价,而不是暴力的每个价格试? 可以证明开盘价永远在买单中。简单的举个栗子,...

Aiven 915

百度竞价推广超全代码

百度竞价推广会也会用到一些简单的代码,今天SEM联盟小编就给大家总结了,竞价员们一定要知道的代码。 百度竞价代码可以分为咨询工具代码与网站统计代码两个种类。一、咨询工具代码乐语网站浮窗代码

一笑的博客 3588

集合竞价 CCF java实现 (大部分代码是借鉴的别人的,)

(只是把借鉴代码完善成100分了,分享给大家) 问题描述   某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。   该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:   1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。   2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为

刷刷刷 3743
上一篇: 为什么oj自动结束输入,而本地IDE不能
下一篇: cin、cin.get()、cin.getline()、getline()的区别
cloudless_sky
博客等级 码龄8年 106粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值