技巧总结
- 当需要一对数据取最值时,不一定需要用pair进行存储(比较繁琐),利用两个变量维护当前最值
- 要注意数据范围是否会爆int
- 所有数据定义时一定不要忘记初始化
题目描述
解题思路
- 数据范围不大只有5000, 所以可以选择用暴力n*2解决
- 由于题目中指出相同的开盘成交量,选取较高的开盘价,所以枚举的价格应该是题目中给出的价格,因为如果你取题目中出现的两个价格的中间的值,则同样的开盘成交量的最高开盘价必定是已经给出的价格
- 题目的意思言简意赅就是,对于一个给定价格p,计算买进价格 >= p 的股票数量,卖出价格 <= p 的股票数量,两者取较小值,计算所有成交数量中的最大值,以及对应的最大的价格p
代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5010;
struct share
{
string character;
double price;
int number;
bool flag;
}shares[N];
int main()
{
int cnt = 0;
string a;
while(cin >> a)
{
double p = 0.0;
int n = 0;
int c = 0;
if (a == "buy")
{
cin >> p >> n;
shares[ ++ cnt] = {"buy", p, n, true};
}
else if(a == "sell")
{
cin >> p >> n;
shares[ ++ cnt] = {"sell", p, n, true};
}
else if (a == "cancel")
{
cin >> c;
shares[c].flag = false;
shares[ ++ cnt].flag = false;
}
}
long long s = 0;
double p = 0;
for (int i = 1; i <= cnt; i ++)
{
if(!shares[i].flag) continue;
long long sum1 = 0;
long long sum2 = 0;
for (int j = 1; j <= cnt; j ++)
{
if(!shares[j].flag) continue;
if(shares[j].character == "buy")
{
if(shares[j].price >= shares[i].price) sum1 += shares[j].number;
}
else if(shares[j].character == "sell")
{
if(shares[j].price <= shares[i].price) sum2 += shares[j].number;
}
}
long long res = min(sum1, sum2);
if(res > s || (res == s && shares[i].price > p))
{
s = res;
p = shares[i].price;
}
}
printf("%.2f", p);
cout << " " << s;
return 0;
}
|