C++程序:寻找糖果分配的最小k值


假设我们有一个包含n个元素的数组A。Amal有n个朋友,他的第i个朋友有A[i]颗糖果。Amal的朋友们不喜欢他们拥有不同数量的糖果。因此,Amal执行以下操作集恰好一次:

  • Amal选择k (0 ≤ k ≤n)个任意朋友

  • Amal将他们的A[i1] + A[i2] + ... + A[ik]颗糖果分配给所有n个朋友。在分配过程中,对于每颗A[i1] + A[i2] + ... + A[ik]糖果,他都会选择新的拥有者。这可以是任何n个朋友中的一个。(任何糖果都可以给予在分配过程之前拥有该糖果的人)。

并且,k值并非预先固定,可以是任意的。我们需要找到k的最小值。

问题类别

上述问题可以通过应用贪心算法解决。贪心算法是一种选择当前最佳解而不是遍历所有可能解的算法。贪心算法也用于解决优化问题,就像它的“兄长”动态规划一样。在动态规划中,需要遍历所有可能的子问题才能找到最优解,但这有一个缺点:它需要更多的时间和空间。因此,在各种情况下,贪心算法被用来找到问题的最优解。虽然它并非在所有情况下都能给出最优解,但如果设计得当,它可以比动态规划更快地产生解。贪心算法为优化问题提供局部最优解。这种技术的例子包括克鲁斯卡尔和普里姆最小生成树 (MST) 算法、霍夫曼树编码、迪杰斯特拉单源最短路径问题等。

https://tutorialspoint.com/data_structures_algorithms/greedy_algorithms.htm

https://tutorialspoint.com/data_structures_algorithms/dynamic_programming.htm

因此,如果我们问题的输入类似于A = [4, 5, 2, 5],则输出将为2。

步骤

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

sum := 0
ans := 0
n := size of A
for initialize i := 0, when i < n, update (increase i by 1), do:
   sum := sum + A[i]
if sum mod n is not equal to 0, then:
   return -1
Otherwise
   sum := sum / n
   for initialize i := 0, when i < n, update (increase i by 1), do:
      if A[i] > sum, then:
         (increase ans by 1)
      return ans

示例

让我们看看下面的实现来更好地理解:

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> A){
   int n, sum = 0, ans = 0;
   n = A.size();
   for (int i = 0; i < n; i++)
      sum += A[i];
   if (sum % n != 0)
      return -1;
   else{
      sum /= n;
      for (int i = 0; i < n; i++)
         if (A[i] > sum)
            ans++;
      return ans;
   }
}
int main(){
   vector<int> A = { 4, 5, 2, 5 };
   cout << solve(A) << endl;
}

输入

{ 4, 5, 2, 5 }

输出

2

更新于:2022年4月8日

284 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.