检查 N 个骰子的可见面的最大和是否至少为 X


在解决编程中的复杂问题时,效率和准确性通常至关重要。一个特殊的挑战涉及适当地识别 N 个骰子的可见面的最大和是否等于或超过 X。在这篇文章中,我们评估了使用 C++ 代码解决此难题的各种方法,包括语法解释和分步算法。此外,我们将提供两个基于上述方法的真实的、完整的可执行代码示例。最后,您将清楚地了解如何在 C++ 中检查 N 个骰子的可见面的最大和是否至少为 X。

语法

在深入探讨各种方法之前,让我们首先了解以下代码中将使用的方法的语法 -

bool checkVisibleSum(int N, int X, vector<int>& dice);

方法 1

算法

  • 首先将变量 visibleSum 初始化为 0。此变量将存储可见面的总和。

  • 遍历骰子向量中的每个元素。

  • 对于每个骰子,按降序排列其各个面。

  • 将最大面(排序后的第一个元素)添加到 visibleSum 中。

  • 如果在任何时候 visibleSum 大于或等于 X,则返回 true。

  • 如果迭代完成而没有找到大于或等于 X 的可见和,则返回 false。

示例

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

bool checkVisibleSum(int N, int X, vector<vector<int>>& dice) {
   int visibleSum = 0;

   for (int i = 0; i < dice.size(); i++) {
      sort(dice[i].rbegin(), dice[i].rend());
      visibleSum += dice[i][0];

      if (visibleSum >= X)
         return true;
   }

   return false;
}

int main() {
   int N = 2; // Number of dice

   vector<vector<int>> dice(N);
   dice[0] = {6, 5, 4}; // Faces of dice 1
   dice[1] = {3, 2, 1}; // Faces of dice 2

   int X = 15; // Minimum sum (X)

   if (checkVisibleSum(N, X, dice))
      cout << "The maximum sum of visible faces of the dice is at least " << X << ".\n";
   else
      cout << "The maximum sum of visible faces of the dice is not at least " << X << ".\n";

   return 0;
}

输出

The maximum sum of visible faces of the dice is not at least 15.

解释

在此代码中,我们首先定义函数 checkVisibleSum,它接受三个参数:N(骰子的数量)、X(最小和)和 dice(一个向量,包含表示骰子各个面的向量)。

checkVisibleSum 函数实现了方法 1。它将变量 visibleSum 初始化为 0,该变量将存储可见面的总和。然后,它遍历 dice 向量中的每个骰子。对于每个骰子,它使用 sort(dice[i].rbegin(), dice[i].rend()) 按降序排列各个面。这确保了最大面位于排序后的向量的开头。

然后,代码使用 visibleSum += dice[i][0] 将当前骰子的最大面添加到 visibleSum 中。通过使用此函数,可以更好地理解在任何给定场景中可能出现的某些情况。

这可以通过它分析给定的 visibleSum 在其分析过程中的各个点是否超过或等于 X 来体现。如果他们在研究过程中检测到这种情况 - 通常由 true 输出表示 - 那么他们可以自信地得出某种程度的结论,即可见特征的最大数量等于或大于他们最初打算超过的 X。

相反,如果他们在进行一定程度的探索和计算后没有发现这些统计数据,那么很明显还有更多未解答的问题。

在 main 函数中,我们提示用户输入骰子的数量 (N)。我们创建一个名为 dice 的向量,用于存储每个骰子的各个面。然后,我们迭代 N 次,并且对于每个骰子,提示用户输入面的数量和各个面本身。我们将这些值存储在 dice 向量中。

接下来,我们要求用户输入最小和 (X)。我们将 N、X 和 dice 传递给 checkVisibleSum 函数。我们将相应地发送一条信息,说明可见骰子面的最大可能和等于或大于 X。然而,与这种情况的积极前景相反,这可能是因为我们发布了关于该函数实际上如何产生低于预期结果的信息(与 X 相比)。

方法 2

算法

  • 首先将变量 visibleSum 初始化为 0。此变量将存储可见面的总和。

  • 遍历骰子向量中的每个元素。

  • 对于每个骰子,按降序排列其各个面。

  • 计算前 N - 1 个面的总和(不包括最大面),并将其添加到 visibleSum 中。

  • 如果 visibleSum 大于或等于 X,则返回 true。

  • 如果迭代完成而没有找到大于或等于 X 的可见和,则返回 false。

示例

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>

using namespace std;

bool checkVisibleSum(int N, int X, vector<vector<int>>& dice) {
   int visibleSum = 0;

   for (int i = 0; i < dice.size(); i++) {
      sort(dice[i].rbegin(), dice[i].rend());
      int sum = accumulate(dice[i].begin(), dice[i].end() - 1, 0);
      visibleSum += sum;

      if (visibleSum >= X)
         return true;
   }

   return false;
}

int main() {
   int N = 2; // Number of dice

   vector<vector<int>> dice(N);
   dice[0] = {6, 5, 4}; // Faces of dice 1
   dice[1] = {3, 2, 1}; // Faces of dice 2

   int X = 15; // Minimum sum (X)

   if (checkVisibleSum(N, X, dice))
      cout << "The maximum sum of visible faces of the dice is at least " << X << ".\n";
   else
      cout << "The maximum sum of visible faces of the dice is not at least " << X << ".\n";

   return 0;
}

输出

The maximum sum of visible faces of the dice is at least 15.

解释

在此代码中,我们具有与方法 1 中相同的 checkVisibleSum 函数。但是,主要区别在于可见和的计算。

方法 2 对每个骰子的前 N - 1 个面求和,不包括最大面。为此,我们使用 <numeric> 库中的 accumulate 函数。我们将 dice[i].begin() 和 dice[i].begin() + N - 1 作为累加范围传递,有效地对所需的面求和。

main 函数中的其余代码与前面的示例相同。

结论

通过这篇文章,我们的主题围绕着解决一个关于 C++ 编码的基本问题:如何准确地发现给定的一组 (N) 骰子在其可见面的最大值下是否至少加起来为 X?为了最佳地回答这个问题,我们找到了两个实用的解决方案:首先,确保每次滚动都返回其总和等于或大于 X 的值;其次,评估仅前 N-1 次滚动的总值,并评估它们是否也匹配或超过 X。此外,我们为读者提供了特定于方法的代码设置以及有关有效执行这些过程的详细指南。此外,我们还提供了两个基于这些方法的真实的、完整的可执行代码示例。通过利用本文中提供的知识和代码,您现在可以自信地解决在 C++ 编程中确定 N 个骰子的可见面的最大和是否至少为 X 的问题。

更新于: 2023-07-25

37 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告