diff --git a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README.md b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README.md index a1428ef862b5f..7abefe93c5b22 100644 --- a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README.md +++ b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README.md @@ -225,25 +225,100 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3600-3699/3645.Ma #### Python3 ```python - +class Solution: + def maxTotal(self, value: List[int], limit: List[int]) -> int: + g = defaultdict(list) + for v, lim in zip(value, limit): + g[lim].append(v) + ans = 0 + for lim, vs in g.items(): + vs.sort() + ans += sum(vs[-lim:]) + return ans ``` #### Java ```java - +class Solution { + public long maxTotal(int[] value, int[] limit) { + Map> g = new HashMap<>(); + for (int i = 0; i < value.length; ++i) { + g.computeIfAbsent(limit[i], k -> new ArrayList<>()).add(value[i]); + } + long ans = 0; + for (var e : g.entrySet()) { + int lim = e.getKey(); + var vs = e.getValue(); + vs.sort((a, b) -> b - a); + for (int i = 0; i < Math.min(lim, vs.size()); ++i) { + ans += vs.get(i); + } + } + return ans; + } +} ``` #### C++ ```cpp - +class Solution { +public: + long long maxTotal(vector& value, vector& limit) { + unordered_map> g; + int n = value.size(); + for (int i = 0; i < n; ++i) { + g[limit[i]].push_back(value[i]); + } + long long ans = 0; + for (auto& [lim, vs] : g) { + sort(vs.begin(), vs.end(), greater()); + for (int i = 0; i < min(lim, (int) vs.size()); ++i) { + ans += vs[i]; + } + } + return ans; + } +}; ``` #### Go ```go +func maxTotal(value []int, limit []int) (ans int64) { + g := make(map[int][]int) + for i := range value { + g[limit[i]] = append(g[limit[i]], value[i]) + } + for lim, vs := range g { + slices.SortFunc(vs, func(a, b int) int { return b - a }) + for i := 0; i < min(lim, len(vs)); i++ { + ans += int64(vs[i]) + } + } + return +} +``` +#### TypeScript + +```ts +function maxTotal(value: number[], limit: number[]): number { + const g = new Map(); + for (let i = 0; i < value.length; i++) { + if (!g.has(limit[i])) { + g.set(limit[i], []); + } + g.get(limit[i])!.push(value[i]); + } + let ans = 0; + for (const [lim, vs] of g) { + vs.sort((a, b) => b - a); + ans += vs.slice(0, lim).reduce((acc, v) => acc + v, 0); + } + return ans; +} ``` diff --git a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README_EN.md b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README_EN.md index 32b3dd17e080c..cfd5965ca310a 100644 --- a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README_EN.md +++ b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/README_EN.md @@ -223,25 +223,100 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3600-3699/3645.Ma #### Python3 ```python - +class Solution: + def maxTotal(self, value: List[int], limit: List[int]) -> int: + g = defaultdict(list) + for v, lim in zip(value, limit): + g[lim].append(v) + ans = 0 + for lim, vs in g.items(): + vs.sort() + ans += sum(vs[-lim:]) + return ans ``` #### Java ```java - +class Solution { + public long maxTotal(int[] value, int[] limit) { + Map> g = new HashMap<>(); + for (int i = 0; i < value.length; ++i) { + g.computeIfAbsent(limit[i], k -> new ArrayList<>()).add(value[i]); + } + long ans = 0; + for (var e : g.entrySet()) { + int lim = e.getKey(); + var vs = e.getValue(); + vs.sort((a, b) -> b - a); + for (int i = 0; i < Math.min(lim, vs.size()); ++i) { + ans += vs.get(i); + } + } + return ans; + } +} ``` #### C++ ```cpp - +class Solution { +public: + long long maxTotal(vector& value, vector& limit) { + unordered_map> g; + int n = value.size(); + for (int i = 0; i < n; ++i) { + g[limit[i]].push_back(value[i]); + } + long long ans = 0; + for (auto& [lim, vs] : g) { + sort(vs.begin(), vs.end(), greater()); + for (int i = 0; i < min(lim, (int) vs.size()); ++i) { + ans += vs[i]; + } + } + return ans; + } +}; ``` #### Go ```go +func maxTotal(value []int, limit []int) (ans int64) { + g := make(map[int][]int) + for i := range value { + g[limit[i]] = append(g[limit[i]], value[i]) + } + for lim, vs := range g { + slices.SortFunc(vs, func(a, b int) int { return b - a }) + for i := 0; i < min(lim, len(vs)); i++ { + ans += int64(vs[i]) + } + } + return +} +``` +#### TypeScript + +```ts +function maxTotal(value: number[], limit: number[]): number { + const g = new Map(); + for (let i = 0; i < value.length; i++) { + if (!g.has(limit[i])) { + g.set(limit[i], []); + } + g.get(limit[i])!.push(value[i]); + } + let ans = 0; + for (const [lim, vs] of g) { + vs.sort((a, b) => b - a); + ans += vs.slice(0, lim).reduce((acc, v) => acc + v, 0); + } + return ans; +} ``` diff --git a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.cpp b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.cpp new file mode 100644 index 0000000000000..9c8c7dcc3437e --- /dev/null +++ b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.cpp @@ -0,0 +1,18 @@ +class Solution { +public: + long long maxTotal(vector& value, vector& limit) { + unordered_map> g; + int n = value.size(); + for (int i = 0; i < n; ++i) { + g[limit[i]].push_back(value[i]); + } + long long ans = 0; + for (auto& [lim, vs] : g) { + sort(vs.begin(), vs.end(), greater()); + for (int i = 0; i < min(lim, (int) vs.size()); ++i) { + ans += vs[i]; + } + } + return ans; + } +}; diff --git a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.go b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.go new file mode 100644 index 0000000000000..b48d7e15e248c --- /dev/null +++ b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.go @@ -0,0 +1,13 @@ +func maxTotal(value []int, limit []int) (ans int64) { + g := make(map[int][]int) + for i := range value { + g[limit[i]] = append(g[limit[i]], value[i]) + } + for lim, vs := range g { + slices.SortFunc(vs, func(a, b int) int { return b - a }) + for i := 0; i < min(lim, len(vs)); i++ { + ans += int64(vs[i]) + } + } + return +} diff --git a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.java b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.java new file mode 100644 index 0000000000000..54bf72518e6d5 --- /dev/null +++ b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.java @@ -0,0 +1,18 @@ +class Solution { + public long maxTotal(int[] value, int[] limit) { + Map> g = new HashMap<>(); + for (int i = 0; i < value.length; ++i) { + g.computeIfAbsent(limit[i], k -> new ArrayList<>()).add(value[i]); + } + long ans = 0; + for (var e : g.entrySet()) { + int lim = e.getKey(); + var vs = e.getValue(); + vs.sort((a, b) -> b - a); + for (int i = 0; i < Math.min(lim, vs.size()); ++i) { + ans += vs.get(i); + } + } + return ans; + } +} diff --git a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.py b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.py new file mode 100644 index 0000000000000..27ed839578a30 --- /dev/null +++ b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.py @@ -0,0 +1,10 @@ +class Solution: + def maxTotal(self, value: List[int], limit: List[int]) -> int: + g = defaultdict(list) + for v, lim in zip(value, limit): + g[lim].append(v) + ans = 0 + for lim, vs in g.items(): + vs.sort() + ans += sum(vs[-lim:]) + return ans diff --git a/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.ts b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.ts new file mode 100644 index 0000000000000..e2291c15ec47e --- /dev/null +++ b/solution/3600-3699/3645.Maximum Total from Optimal Activation Order/Solution.ts @@ -0,0 +1,15 @@ +function maxTotal(value: number[], limit: number[]): number { + const g = new Map(); + for (let i = 0; i < value.length; i++) { + if (!g.has(limit[i])) { + g.set(limit[i], []); + } + g.get(limit[i])!.push(value[i]); + } + let ans = 0; + for (const [lim, vs] of g) { + vs.sort((a, b) => b - a); + ans += vs.slice(0, lim).reduce((acc, v) => acc + v, 0); + } + return ans; +}