AcWing 3209-csp. 集合竞价
原题链接
简单
作者:
YAX_AC
,
2024-11-14 18:46:36
,
所有人可见
,
阅读 2
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 5010;
typedef long long LL;
//确定一个价格p0,在买的记录里面,所有股数大于等于p0一共有多少股数s1
//在卖的记录里面,所有小于等于p0的一共有多少股数s2,取s1,s2最小值min(s1,s2)
//确定一个开盘价p0,使得开盘成交量尽可能地大,max(s)
//如果有多个符合条件的开盘价,你的程序应当输出最高的那一个
int n;
struct R
{
int type;
double p;
LL s;
bool is_del;
}d[N];
int main()
{
string type;
double p;
LL s;
while(cin>>type)
{
if(type == "buy")
{
cin>>p>>s;
d[++n] = {1,p,s};
}
else if(type == "sell")
{
cin>>p>>s;
d[++n] = {2,p,s};
}
else
{
int id;
cin>>id;
d[id].is_del = true;
d[++n].is_del = true;
}
}
double resp;//开盘价
LL ress = 0;//开盘价的成交量
for(int i = 1; i<=n; i++)//枚举所有可行的价格p0
if(d[i].is_del==false)
{
double p = d[i].p;
LL s1 = 0,s2 = 0;
for(int j = 1; j<=n; j++) //枚举所有的记录
if(d[j].is_del==false)
{
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",resp,ress);
return 0;
}