K 個の要素を含む配列 A があるとします。 N 人のプレイヤーとゲーム マスターがいるゲームを考えてみましょう。このゲームには K ラウンドがあります。ゲームのラウンド i で、ゲーム マスターは A[i] 人の子供がグループを形成することを発表します。残りの子は、可能な限り多くの A[i] 子のグループを形成します。お子様は複数のグループに参加することはできません。グループ内の誰もゲームから離れません。他の人は次のラウンドに進みます。ラウンド中にプレイヤーの損失がない場合もあります。最終的に、ラウンド K が終了し、2 人の子供だけが残り、彼らが勝者と宣言されました。開始する前に、ゲーム内に存在する可能性のある子の最小数と最大数を見つけるか、N が有効な値ではないと判断する必要があります。
したがって、入力が A = [3, 4 , 3, 2] のような場合、出力は [6, 8] になります。これは、ゲームが 6 人の子で開始された場合は続行されるためです。
最初のラウンドでは、6 人がそれぞれ 3 人ずつの 2 つのグループを形成しました
n := size of A Define a large array a, l, r, a of size: 100010. l := 2, r = 2 for initialize i := 1, when i <= n, update (increase i by 1), do: a[i] := A[i - 1] for initialize i := n, when i >= 1, update (decrease i by 1), do: x := a[i], L := (l + x - 1) if L > R, then: return -1, 0 l := L, r = R + x - 1 return l, r例理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h> using namespace std; void solve(vector<int> A){ int n = A.size(); int l, r, a[100010]; l = 2, r = 2; for (int i = 1; i <= n; i++) a[i] = A[i - 1]; for (int i = n; i >= 1; i--){ int x = a[i], L = (l + x - 1) / x * x, R = r / x * x; if (L > R){ cout << "-1, 0"; } l = L, r = R + x - 1; } cout << l << ", " << r << endl; return; } int main(){ vector<int> A = { 3, 4, 3, 2 }; solve(A); }入力
{ 3, 4, 3, 2 }
6, 8
以上がゲーム開始前に子の最小数と最大数を見つける C++ プログラムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。