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