123

77 阅读3分钟

好的,让我们来逐步解决这个问题。首先,我们需要理解如何从给定的牌中找到符合条件的“葫芦”组合。以下是一些代码提示,帮助你实现这个功能:

  1. 统计牌的出现次数
    首先,我们需要统计每种牌面值出现的次数。可以使用一个哈希表(或数组)来记录每种牌面值的出现次数。
  2. 筛选出可能的三张相同牌面值
    遍历统计结果,找出所有出现次数大于等于3的牌面值。这些牌面值可以作为“葫芦”中的三张相同牌面值。
  3. 筛选出可能的两张相同牌面值
    对于每一个可能的三张相同牌面值,再遍历统计结果,找出所有出现次数大于等于2的牌面值。这些牌面值可以作为“葫芦”中的两张相同牌面值。
  4. 计算牌面值之和并筛选
    对于每一个可能的“葫芦”组合,计算其牌面值之和,并检查是否小于等于给定的最大值 max
  5. 选择最大的“葫芦”组合
    在所有符合条件的“葫芦”组合中,选择牌面值最大的组合。如果牌面值相同,则比较两张相同牌面值的大小。

以下是一些代码提示,帮助你实现这些步骤:

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;

}

代码解释:

  1. 统计牌的出现次数:使用 unordered_map 来记录每种牌面值的出现次数。
  2. 筛选出可能的三张相同牌面值:遍历 count,找出所有出现次数大于等于3的牌面值。
  3. 筛选出可能的两张相同牌面值:遍历 count,找出所有出现次数大于等于2的牌面值。
  4. 计算牌面值之和并筛选:对于每一个可能的“葫芦”组合,计算其牌面值之和,并检查是否小于等于 max
  5. 选择最大的“葫芦”组合:在所有符合条件的“葫芦”组合中,选择牌面值最大的组合。

你可以根据这些提示继续完善你的代码。如果有任何问题或需要进一步的帮助,请告诉我!

如何处理牌面值为1的情况?

查看答案代码

帮我检查一下编辑区的代码