C++程序检查我们可以通过选择框移除所有石头

假设我们有一个包含 N 个元素的数组 A。考虑有 N 个盒子,它们排列成一个圆圈。第 i 个盒子包含 A[i] 个石头。我们必须通过重复执行以下操作来检查是否可以从盒子中取出所有石头: 选择一个盒子说第 i 个盒子。对于 1 到 N 范围内的每个 j,从第 (i+j) 个盒子中准确移除 j 个石头。这里将第 (N+k) 个框称为第 k 个框。如果盒子中没有足够数量的石头,则无法执行此操作。

因此,如果输入像 A = [4, 5, 1, 2, 3],那么输出将为 True,因为我们可以从第二个框开始移除所有石头。

为了解决这个问题,我们将遵循以下步骤 -

n := size of A

Define an array a of size (n + 1)

Define an array b of size (n + 1)

sum := 0, p := n * (n + 1)

for initialize i := 1, when i <= n, update (increase i by 1), do:

   a[i] := A[i - 1]

   sum := sum + a[i]

if sum mod p is not equal to 0, then:

   return false

k := sum / p

for initialize i := 1, when i <= n, update (increase i by 1), do:

   b[i] := a[i] - a[(i mod n) + 1]

sum := 0

for initialize i := 1, when i <= n, update (increase i by 1), do:

   a[i] := b[i]

   sum := sum + a[i]

if sum is not equal to 0, then:

   return false

for initialize i := 1, when i <= n, update (increase i by 1), do:

   if (a[i] + k) mod n is not equal to 0 or a[i] + k < 0, then:

      return false

return true

示例

让我们看看以下实现以更好地理解 -

#include <bits/stdc++.h>

using namespace std;

bool solve(vector<int> A) {

   int n = A.size();

   vector<int> a(n + 1);

   vector<int> b(n + 1);

   int sum = 0, p = n * (n + 1) / 2;

   for (int i = 1; i <= n; i++) {

      a[i] = A[i - 1];

      sum += a[i];

   }

   if (sum % p != 0) {

      return false;

   }

   int k = sum / p;

   for (int i = 1; i <= n; i++) {

      b[i] = a[i] - a[i % n + 1];

   }

   sum = 0;

   for (int i = 1; i <= n; i++) {

      a[i] = b[i];

      sum += a[i];

   }

   if (sum != 0) {

      return false;

   }

   for (int i = 1; i <= n; i++) {

      if ((a[i] + k) % n != 0 || a[i] + k < 0) {

         return false;

      }

   }

   return true;

}

int main(){

   vector<int> A = { 4, 5, 1, 2, 3 };

   cout << solve(A) << endl;

}

输入

{ 4, 5, 1, 2, 3 }
输出结果
1

以上是 C++程序检查我们可以通过选择框移除所有石头 的全部内容, 来源链接: utcz.com/z/297181.html

回到顶部