檢查 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 次檢視

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告