C++ 代码,在不超出 k 的前提下计算复制操作次数


假设我们有一个包含 n 个元素的数组 A 和另一个数字 k。有 n 堆糖果。第 i 堆有 A[i] 个糖果。我们可以在两个索引 i 和 j (i != j) 上执行此操作,然后在 A[i] 中再添加 A[i] 个糖果(A[i] 不会减少)。我们可以执行此操作任意多次,但不幸的是,如果某一堆糖果严格超过 k 个,我们则无法再执行此操作。我们必须找出我们可以执行此操作的最多数次。

因此,如果输入为 A = [1, 2, 3]; k = 5,则输出将为 5,因为我们可以将 i = 0 视作 j = 1 三次,并视作 j = 2 两次。因此,总共 5 次。

步骤

要解决此问题,我们将遵循以下步骤:

ans := 0
n := size of A
sort the array A
for initialize i := 1, when i < n, update (increase i by 1), do:
   ans := ans + (k - A[i])
return ans

示例

让我们看看以下实现以加深理解:

#include <bits/stdc++.h>
using namespace std;
int solve(vector<int> A, int k){
   int ans = 0;
   int n = A.size();
   sort(A.begin(), A.end());
   for (int i = 1; i < n; i++){
      ans += (k - A[i]) / A[0];
   }
   return ans;
}
int main(){
   vector<int> A = { 1, 2, 3 };
   int k = 5;
   cout << solve(A, k) << endl;
}

输入

{ 1, 2, 3 }, 5

输出

5

更新于: 11-Mar-2022

149 次浏览

启动您的 职业生涯

完成课程即可获得认证

开始
广告