deno.land / x / masx200_leetcode_test@10.6.5 / NyZD2B / index.ts

نووسراو ببینە
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import { AvlTree } from "https://esm.sh/@datastructures-js/binary-search-tree@5.0.2/?dts";
import { traverseInOrder } from "./traverseInOrder.ts";
class VendingMachine { #customer2discount = new Map<string, number>(); #item2good = new Map< string, [AvlTree<{ expires: number; price: number; count: number }>, number] >();
constructor() {}
addItem( time: number, number: number, item: string, price: number, duration: number, ): void { const good = this.#item2good.get(item) ?? [ new AvlTree((a, b) => a.price !== b.price ? a.price - b.price : a.expires - b.expires ), 0, ]; good[1] += number; this.#item2good.set(item, good); good[0].insert({ expires: time + duration, price, count: number }); }
sell( time: number, customer: string, item: string, number: number, ): number { const good = this.#item2good.get(item);
if (!good) return -1; if (good[1] < number) return -1;
const tree = good[0]; let count = 0;
let cost = 0; const toberemove: { expires: number; price: number; count: number; }[] = [];
const ac = new AbortController(); const { signal } = ac; const callbacks: (() => void)[] = []; traverseInOrder(tree, (node) => { if (count >= number) return ac.abort(); const value = node.getValue(); if (!value) { return; } if (value.expires < time || value.count <= 0) { good[1] -= value.count; toberemove.push(value); } else { const diff = Math.min(number - count, value.count); count += diff;
callbacks.push(() => { value.count -= diff; if (value.count <= 0) { tree.remove(value); } }); cost += value.price * diff; } }, signal);
toberemove.forEach((n) => tree.remove(n)); if (good[1] < number || cost === 0) { return -1; }
good[1] -= number;
callbacks.forEach((c) => c()); const discount = this.#customer2discount.get(customer) ?? 100; const result = Math.ceil(cost * discount / 100); this.#customer2discount.set(customer, Math.max(70, discount - 1)); return result; }}export default VendingMachine;
masx200_leetcode_test

Version Info

Tagged at
a year ago