好的,让我们来逐步解决这个问题。首先,我们需要理解如何从给定的牌中找到符合条件的“葫芦”组合。以下是一些代码提示,帮助你实现这个功能:
- 统计牌的出现次数:
首先,我们需要统计每种牌面值出现的次数。可以使用一个哈希表(或数组)来记录每种牌面值的出现次数。 - 筛选出可能的三张相同牌面值:
遍历统计结果,找出所有出现次数大于等于3的牌面值。这些牌面值可以作为“葫芦”中的三张相同牌面值。 - 筛选出可能的两张相同牌面值:
对于每一个可能的三张相同牌面值,再遍历统计结果,找出所有出现次数大于等于2的牌面值。这些牌面值可以作为“葫芦”中的两张相同牌面值。 - 计算牌面值之和并筛选:
对于每一个可能的“葫芦”组合,计算其牌面值之和,并检查是否小于等于给定的最大值max。 - 选择最大的“葫芦”组合:
在所有符合条件的“葫芦”组合中,选择牌面值最大的组合。如果牌面值相同,则比较两张相同牌面值的大小。
以下是一些代码提示,帮助你实现这些步骤:
cpp
#include
#include
#include <unordered_map>
#include
std::vector solution(int n, int max, const std::vector&
array) {
// Step 1: 统计每种牌面值的出现次数
std::unordered_map<int, int> count;
for (int card : array) {
count[card]++;
}
// Step 2: 筛选出可能的三张相同牌面值
std::vector possible_three;
for (const auto& pair : count) {
if (pair.second >= 3) {
possible_three.push_back(pair.first);
}
}
// Step 3: 筛选出可能的两张相同牌面值
std::vector possible_two;
for (const auto& pair : count) {
if (pair.second >= 2) {
possible_two.push_back(pair.first);
}
}
// Step 4: 计算牌面值之和并筛选
std::vector best_result = {0, 0};
for (int three : possible_three) {
for (int two : possible_two) {
if (three != two) {
int sum = 3 * three + 2 * two;
if (sum <= max) {
// Step 5: 选择最大的“葫芦”组合
if (three > best_result[0] || (three ==
best_result[0] && two > best_result[1])) {
best_result = {three, two};
}
}
}
}
}
return best_result;
}
int main() {
// Add your test cases here
std::vector result1 = solution(9, 34, {6, 6, 6, 8, 8, 8, 5,
5, 1});
std::cout << (result1 == std::vector{8, 5}) << std::endl;
std::vector result2 = solution(9, 37, {9, 9, 9, 9, 6, 6, 6,
6, 13});
std::cout << (result2 == std::vector{6, 9}) << std::endl;
std::vector result3 = solution(9, 40, {1, 11, 13, 12, 7, 8,
11, 5, 6});
std::cout << (result3 == std::vector{0, 0}) << std::endl;
return 0;
}
代码解释:
- 统计牌的出现次数:使用
unordered_map来记录每种牌面值的出现次数。 - 筛选出可能的三张相同牌面值:遍历
count,找出所有出现次数大于等于3的牌面值。 - 筛选出可能的两张相同牌面值:遍历
count,找出所有出现次数大于等于2的牌面值。 - 计算牌面值之和并筛选:对于每一个可能的“葫芦”组合,计算其牌面值之和,并检查是否小于等于
max。 - 选择最大的“葫芦”组合:在所有符合条件的“葫芦”组合中,选择牌面值最大的组合。
你可以根据这些提示继续完善你的代码。如果有任何问题或需要进一步的帮助,请告诉我!
如何处理牌面值为1的情况?
查看答案代码
帮我检查一下编辑区的代码