Skip to content

Commit cb0460e

Browse files
committed
add: 拿出最少数目的魔法豆
1 parent a88498a commit cb0460e

5 files changed

+58
-1
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -629,6 +629,10 @@ C++标准库提供的数据结构实在是太多了,参考[C++标准库头文
629629

630630
### 排序
631631

632+
- [拿出最少数目的魔法豆](src/sort/removing_minimum_number_of_magic_beans.cpp) [数组, 前缀和, 排序]
633+
634+
- LeetCode 2171. 拿出最少数目的魔法豆 <https://leetcode.cn/problems/removing-minimum-number-of-magic-beans>
635+
632636
- [购买两块巧克力](src/sort/buy_two_chocolates.cpp) [数组, 排序]
633637

634638
- LeetCode 2706. 购买两块巧克力 <https://leetcode.cn/problems/buy-two-chocolates>
Loading
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// 拿出最少数目的魔法豆
2+
// https://leetcode.cn/problems/removing-minimum-number-of-magic-beans
3+
// INLINE ../../images/sort/removing_minimum_number_of_magic_beans.jpeg
4+
5+
#include <headers.hpp>
6+
7+
class Solution {
8+
public:
9+
long long minimumRemoval(vector<int> &beans) {
10+
int n = beans.size();
11+
sort(beans.begin(), beans.end());
12+
long long total = accumulate(beans.begin(), beans.end(), 0LL);
13+
long long res = total;
14+
for (int i = 0; i < n; i++) { // 遍历排序后的 beans 数组
15+
res = min(res, total - (long long)beans[i] * (n - i));
16+
}
17+
return res;
18+
}
19+
};

test/lib/lib_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// 执行编译时间:2024-01-17 13:55:48
1+
// 执行编译时间:2024-01-18 15:29:31
22
#include <gtest/gtest.h>
33
#include <lib.hpp>
44

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <sort/removing_minimum_number_of_magic_beans.cpp>
2+
3+
TEST(拿出最少数目的魔法豆, minimumRemoval) {
4+
Solution solution;
5+
// 示例 1:
6+
// 输入:beans = [4,1,6,5]
7+
// 输出:4
8+
// 解释:
9+
// - 我们从有 1 个魔法豆的袋子中拿出 1 颗魔法豆。
10+
// 剩下袋子中魔法豆的数目为:[4,0,6,5]
11+
// - 然后我们从有 6 个魔法豆的袋子中拿出 2 个魔法豆。
12+
// 剩下袋子中魔法豆的数目为:[4,0,4,5]
13+
// - 然后我们从有 5 个魔法豆的袋子中拿出 1 个魔法豆。
14+
// 剩下袋子中魔法豆的数目为:[4,0,4,4]
15+
// 总共拿出了 1 + 2 + 1 = 4 个魔法豆,剩下非空袋子中魔法豆的数目相等。
16+
// 没有比取出 4 个魔法豆更少的方案。
17+
vector<int> beans = {4, 1, 6, 5};
18+
EXPECT_EQ(solution.minimumRemoval(beans), 4);
19+
20+
// 示例 2:
21+
// 输入:beans = [2,10,3,2]
22+
// 输出:7
23+
// 解释:
24+
// - 我们从有 2 个魔法豆的其中一个袋子中拿出 2 个魔法豆。
25+
// 剩下袋子中魔法豆的数目为:[0,10,3,2]
26+
// - 然后我们从另一个有 2 个魔法豆的袋子中拿出 2 个魔法豆。
27+
// 剩下袋子中魔法豆的数目为:[0,10,3,0]
28+
// - 然后我们从有 3 个魔法豆的袋子中拿出 3 个魔法豆。
29+
// 剩下袋子中魔法豆的数目为:[0,10,0,0]
30+
// 总共拿出了 2 + 2 + 3 = 7 个魔法豆,剩下非空袋子中魔法豆的数目相等。
31+
// 没有比取出 7 个魔法豆更少的方案。
32+
beans = {2, 10, 3, 2};
33+
EXPECT_EQ(solution.minimumRemoval(beans), 7);
34+
}

0 commit comments

Comments
 (0)