这道题不算是模拟,算数学题吧。这道题也是要细心。
思路
- 定的开盘价要使得买单和卖单的成交量最大就是尽可能多的把买单和买单进行匹配。成交量就是买单数和卖单数的最小值。
- 如图
从buy买价开始找开盘价,每一个开盘价,从开盘价往上求出总买单数,往下找出总卖单数,找买卖单最小值,更新最大卖单数。
注意
为什么要从买单开始找开盘价,而不是暴力的每个价格试?
可以证明开盘价永远在买单中。简单的举个栗子,假定客人买东西有10元,东西成本卖5元,给你定价,你会定多少才挣钱?肯定10元啊。所以定价是看客人有多少钱,一样的道理,开盘价永远看买单的价格。
用图说话,看下图,稍微改了下数据。在价格轴上,定价杆(开盘价)在某个价格区间之内都可以达到最大交易量,当然就把杆往上抬,碰到买价为止,所以一定从买价中找开盘价。
ip = []
cancel_list = []
try:
while True:
s = input().split()
if s[0] == 'cancel':
cancel_list.append(int(s[1]) - 1)
ip.append(s)
except EOFError:
pass
buy, sell = {
}, {
}
for i in range(len(ip)):
if i not in cancel_list and ip[i][0] != 'cancel':
if ip[i][0] == 'buy':
if float(ip[i][1]) in buy:
buy[