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 次檢視

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.