问题描述
  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。
  该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:
  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 201412-3 集合竞价 90分代码 C++相关推荐

  1. 202009-4星际旅行 ccf java 90分

    202009-4星际旅行 ccf java 90分 先定义类(坐标点): class Coordinate{double co;//点和o距离int [] dis;//各个维度坐标Coordinate ...

  2. ACMNO.5给出一百分制成绩,要求输出成绩等级‘A’、‘B’、‘C’、‘D’、‘E’。 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E

    题目描述 给出一百分制成绩,要求输出成绩等级'A'.'B'.'C'.'D'.'E'. 90分以上为A 80-89分为B 70-79分为C 60-69分为D 60分以下为E 输入 一个整数0-100以内 ...

  3. c语言学习-对一个百分制的成绩给出相应的等级(如90分以上A,80分以上B等

    对一个百分制的成绩给出相应的等级(如90分以上A,80分以上B等 程序流程图: 代码: #include<stdio.h> void main() {float a; printf(&qu ...

  4. 萌新的Python练习菜鸟100例(十五)利用条件运算符的嵌套来完成此题:学习成绩=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

    题目: 用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 分析: · 使用if-else即可: · 输入数字的时候需要加上int ...

  5. 2022 CCF形式化方法工业应用前沿分论坛暨中科国创高可信联合上海控安新品发布会顺利召开!...

    11月27日,2022年CCF中国软件大会"形式化方法工业应用前沿"技术分论坛暨中科国创高可信联合上海控安新品发布会于线上顺利召开.本次活动由CCF形式化方法专业委员会主办,华东师 ...

  6. mysql一百转化为五分制_设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...

    设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出.90分以上为A,80~90分为B,以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内 ...

  7. html成绩百分制转换为,设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出。90分以上为A,80~90分为B,...

    设计一个程序,将从键盘上输入的百分制成绩转换成对应的五分制成绩并输出.90分以上为A,80~90分为B,以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内 ...

  8. java利用条件运算符的嵌套来完成此题:学习成绩 =90分.....(java50道经典编程题)

    题目:利用条件运算符的嵌套来完成此题:学习成绩> =90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 这是一个写条件运算的例子. 先和大家聊一下条件运算符,所谓条件运算也 ...

  9. C语言编程>第一周 ⑦ 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示

    例题:利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示. 代码如下: /*程序分析:利用条件运算符,如(a>b)?a:b的 ...

最新文章

  1. java一个点向着另一个点移动_java – 在线性路径中从一个点移动一个对象
  2. DIV常见任务(上) - 常规任务
  3. [转]php初级教程(七)一个新闻管理系统(准备工作)
  4. iPhone Three20软件引擎之构建开发环境与HelloWorld
  5. boost::to_address用法实例
  6. hadoop SecondaryNameNode和NameNode
  7. 禁用Microsoft Compatibility Telemetry
  8. 使用nodejs对Marketing Cloud的contact主数据进行修改操作
  9. xss过滤器无法处理ajax请求_thunkPHP 预防XSS攻击
  10. C# Winform 窗体美化(四、镂空窗体)
  11. ubuntu18.04配置远程服务器:安装ssh
  12. FREESPACE 发布 logo v1.1
  13. git报错 warning: Clone succeeded, but checkout failed.
  14. 关于TIdTCPClient的几种方法
  15. 语音合成模型小抄(1)
  16. 戏说数据仓库,商业智能BI中数据仓库的本质是什么?
  17. Boston Dynamics实验:机器狗对垒真小狗
  18. Java 线程 基础知识总结
  19. 文本域默认会放大缩小,如何把文本域设置为禁止推拽状态,从而固定大小呢
  20. 大数据基础课01 如何在庞大的大数据体系中明确路径?

热门文章

  1. 一种绝对安全的跳转单点登陆方法
  2. python中choice的用法_Python中choice用法与三元操作
  3. ❀520七夕情人节告白网页代码❀—浪漫梦幻3D相册(樱花主题)HTML+CSS+JavaScript
  4. 实时行情数据——证券市场(股票、期货、期权)
  5. 企业微信小程序_集成腾讯地图实现精准定位考勤打卡
  6. 应广大粉丝的要求,推荐几本前端书籍
  7. 【C++要笑着学】编码的由来 | basic_string模板类 | string类的常用接口讲解 | 学会查文档
  8. 我的初恋女友与我的现任女友的区别
  9. java计算机毕业设计景区在线购票系统源码+mysql数据库+系统+lw文档+部署
  10. 相机卡丢失照片如何恢复