ccf往年真题-集合竞价

问题描述

  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。
  该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:
  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

评测用例规模与约定

扫描二维码关注公众号,回复: 9501779 查看本文章

  对于100%的数据,输入的行数不超过5000。

思路:我的思路很简单,就是把Buy 和sel的数据分别存进两数组,再定义一个数组存记录,方便cancel操作,之后,对buy数组每一个元素都当成定价,然后去模拟,算交易额,再与最大的交易额进行对比。找到定价最高,交易额最大的值。之前想过用Map等一系列操作,但最后改来该去,还是选择用这个,方便使用。当然时间复杂度有点高,ccf对时间要求不高。因此还好,不过最坑不在这里,一想到考试不能立刻看结果,就不知道自己到底有没有错。我写完之后,提交只有80分,找了很久错误,没有发现,后面才之后原来交易额可能超过int存储的范围,因为只需要定义long long int就行。代码如下:

代码:

#include<cstdio>
#include<iostream>
#include<map>
#include<cstring>
using namespace std;
int main(){
//	map<double,int>p1,p2;
	int x;
	int i=1,j=1,t=1;
	char s[5001][100];
	double jlax[5001],jlbx[5001];//jlax为买出价格集合,b是卖出价格集合 
	int jlay[5001],jlby[5001];//交易 
	int jltx[5001],jlty[5001];//记录每条记录 
	while(scanf("%s",&s[i])!=EOF){	
	//printf("%s %d",s[i],strlen(s[i])); 
	//if(strlen(s[i])==0)
//	break;
	if(s[i][0]=='b'){
	//scanf("%lf%d",&x,&y);
		scanf("%lf%d",&jlax[j],&jlay[j]);
		jltx[i]=1;
		jlty[i]=j;
		j++;
	//	p1[x]=y;
	}
 	if(s[i][0]=='s'){	
		scanf("%lf%d",&jlbx[t],&jlby[t]);
		jltx[i]=2;
		jlty[i]=t++;
	}
	//printf("%s   %lf  %d",s,x,y);
	if(s[i][0]=='c'){
		scanf("%d",&x);
		if(jltx[x]==1){
			jlax[jlty[x]]=0;
			jlay[jlty[x]]=0;
		}else{
			jlbx[jlty[x]]=0;
			jlby[jlty[x]]=0;
		}
	}
	getchar();
	i++;
//	if(i==3)
 // break;
}
//printf("%d ",t);
	long long int sumx=0,sumy=0;//分别记录买和卖的交易额 
	int mi;//循环遍历 
	long long int maxb=0;//存最大的交易额 
	double maxa=0;//存最终的定价 
	double tm;//当前定价 
	for(i=1;i<j;i++){
		sumx=0;
		sumy=0;
		if(t==1||j==1){
			break;
		}
		tm=jlax[i];
		if(tm==0)
		continue;
		for(mi=1;mi<j;mi++){
			if(jlax[mi]>=tm){
				sumx+=jlay[mi];
		//		printf("%d ",sumx);
			}
		}
		for(mi=1;mi<t;mi++){
		//	printf("%lf ",jlbx[mi]);

			if(jlbx[mi]<=tm){
				sumy+=jlby[mi];
			//	printf("%d %d",sumy,jlby[mi]);
			}
		}
		if(sumx>sumy){
			sumx=sumy;
		}
	//	printf("%d %d",sumx,sumy);
		if(maxb<sumx){
			maxa=tm;
			maxb=sumx;
		}else if(maxb==sumx){
			if(maxa<tm){
				maxa=tm;
				
			}
		}
	}
     if(maxb==0){
     	maxa=0;
	 }
	printf("%0.2lf %lld",maxa,maxb);
	return 0;
} 
发布了84 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sunandstarws/article/details/98897135
今日推荐