C语言中两步内可以提取的最大金额


假设我们有两个储物柜,分别称为 L1 和 L2,它们分别包含一定数量的硬币。L1 有 A 个硬币,L2 有 B 个硬币。我们需要从储物柜中提取硬币,使得提取的硬币数量最大化。每次从任何储物柜提取硬币后,该储物柜中的硬币数量会减少 1。如果我们从 L1 中提取 A 个硬币,那么它将被替换为 A-1 个硬币;如果我们从 L2 中提取 B 个硬币,那么它将被替换为 B-1 个硬币。任务是在两步内最大化提取的硬币数量。这意味着硬币只能提取两次。

输入− L1 - 10, L2 - 11

输出 −两步内可以提取的最大金额 − 21

解释 − 在第一步中,我们从 L2 中提取 11 个硬币,L2 将被替换为 11-1=10 个硬币。

在第二步中,L1 和 L2 都有 10 个硬币,所以可以从任意一个中提取,我们有 11+10=21 个硬币,这是最大的。

输入 − L1-5, L2-5

输出 −两步内可以提取的最大金额 − 10

解释 − 在第一步中,我们从 L1 中提取 5 个硬币,L1 将被替换为 5-1=4 个硬币。

在第二步中,L1 有 4 个硬币,L2 有 5 个硬币,所以我们从 L2 中提取 5 个硬币,我们有 5+5=10 个硬币,这是最大的。

下面程序中使用的算法如下

  • 我们有两个储物柜 L1 和 L2,它们是包含一些硬币的整数。

  • 函数 maxMoney(int A, int B) 以储物柜中的硬币数量作为输入。

  • 在 maxMoney() 内部,我们使用变量 ‘money’ 来存储最大金额。

  • 最初,money 取 A 或 B 中较大的值。(money=A>B?A:B)

  • 比较 money 的值与 A 或 B,以检查哪个储物柜的硬币被提取。

  • 现在将该储物柜替换为比之前数量少 1 的数量。(A-- 或 B--)

  • 再次,money 将添加 A 或 B 中较大的值。(money+=A>B?A:B)

    如果 k 小于最小值,则最小的 k 个元素的总和最小 −
  • 在 D1 中存储 abs((整个数组的总和) - (最小的 k 个元素的总和的两倍))。两倍是因为数组总和也包含这些元素。

    如果 k 大于最大值,则最大的 k 个元素的总和最大 −

  • 在 D2 中存储 abs((整个数组的总和) - (最大的 k 个元素的总和的两倍))。两倍是因为数组总和也包含这些元素。

  • 比较 D1 和 D2,并将最大值存储在 maxD 中。

  • 返回 maxD 作为结果。

示例

 实时演示

Code:
#include <stdio.h>
#include <math.h>
// Function to return the maximum coins we can get
int maxMoney(int A, int B){
   //take coins
   int money=A>B?A:B;
   //refill the lockers with 1 less no.of coins
   if(money==A)
      A--;
   else
      B--;
   //withdraw again
   money+=A>B?A:B;
   return money;
}
// Driver code
int main(){
   int L1 = 8, L2 = 9;
   printf("Maximum money that can be withdrawn in two steps: %d" , maxMoney(L1, L2));
   return 0;
}

输出

如果我们运行以上代码,它将生成以下输出 −

Maximum money that can be withdrawn in two steps: 17

更新于: 2020年8月14日

177 次查看

开启你的职业生涯

通过完成课程获得认证

开始学习
广告