CCF-CSP认证资格题解系列——第3次第3题集合竞价

#include<iostream>
#include<algorithm>
using namespace std;
const int N=5010; 
int n;//实时记录总共的信息数 
typedef long long ll;
struct Record{
	int type;//1 buy  2 sell   
	double p;
	int s;
	bool del;
}d[N];
int main(){
	string type;
	while(cin>>type){
		if(type=="buy"){
			double p;
			int s;
			cin>>p>>s;
			d[++n]={1,p,s};
		}else if(type=="sell"){
			double p;
			int s;
			cin>>p>>s;
			d[++n]={2,p,s};
		}else{
			int id;
			cin>>id;
			d[id].del=true;//去看哪一条语句要被删除了
			d[++n].del=true;//自己cancel这一句也要记录 但是没有p和s 也算del=true
		}
	}
	double resp;//开盘价
	ll ress=0;//成交量  可能爆 
	for(int i=1;i<=n;i++){//这也是刚刚需要记录n的一个用处 
		if(d[i].del!=true){
			double p=d[i].p;//取这个记录的价格
			ll s1=0,s2=0;//一定要每次初始化=0!!!!!!不然for循环回来会累加!! 
			// 出价至少为p0的买单的总股数  出价至多为p0的卖单的总股数
			for(int j=1;j<=n;j++){
				if(d[j].del!=true){
					if(d[j].type==1&&d[j].p>=p){
						s1+=d[j].s;
					}else if(d[j].type==2&&d[j].p<=p){
						s2+=d[j].s;
					}
				} 
			} 
			ll t=min(s1,s2);//如果有多个符合条件的开盘价,你的程序应当输出最高的那一个。
			if(t>ress||(t==ress&&p>resp)){//更新的前提是 成交量更高或者成交量一样但是开盘价更高 
				resp=p;
				ress=t;
			} 
		} 
	} 
	printf("%.2lf %lld\n",resp,ress);
	return 0; 
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值