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
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP