Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> การเขียนโปรแกรม C

เงินสูงสุดที่สามารถถอนได้ในสองขั้นตอนในC


เราได้รับตู้เก็บของสองตู้ สมมติว่า L1 และ L2 มีเงินจำนวนหนึ่งในรูปของเหรียญ L1 มีเหรียญ A และ L2 มีเหรียญ B อยู่ในนั้น เราต้องถอนเงินหรือเหรียญออกจากล็อกเกอร์เพื่อให้เงินที่ถอนออกมาได้สูงสุด ทุกครั้งที่ดึงเหรียญออกจากตู้ล็อคเกอร์ จะถูกแทนที่ด้วยเหรียญที่น้อยกว่าจำนวนก่อนหน้า 1 เหรียญ หากเราจั่วเหรียญ A จาก L1 เหรียญจะถูกแทนที่ด้วยเหรียญ A-1 และหากเราดึงเหรียญ B จาก L2 เหรียญนั้นจะถูกแทนที่ด้วยเหรียญ B-1 ภารกิจคือการเพิ่มจำนวนเงินสูงสุดที่ถอนออกในสองขั้นตอน นั่นหมายความว่าสามารถถอนเหรียญได้สองครั้งเท่านั้น

ป้อนข้อมูล − L1 - 10, L2 - 11

ผลผลิต −จำนวนเงินสูงสุดที่สามารถถอนได้ในสองขั้นตอน − 21

คำอธิบาย − ในขั้นตอนที่ 1 เราถอน 11 เหรียญจาก L2 L2 จะถูกแทนที่ด้วย 11-1=10 เหรียญ

ในขั้นตอนที่ 2 ทั้ง L1 และ L2 มี 10 เหรียญ จึงสามารถถอนออกจากเหรียญใดก็ได้ และเรามี 11+10=21 เหรียญ ซึ่งเป็นจำนวนสูงสุด

ป้อนข้อมูล − L1-5, L2-5

ผลผลิต −จำนวนเงินสูงสุดที่สามารถถอนได้ในสองขั้นตอน − 10

คำอธิบาย − ในขั้นตอนที่ 1 เราถอน 5 เหรียญจาก L1 L1 จะถูกแทนที่ด้วย 5-1=4 เหรียญ

ในขั้นตอนที่ 2 ทั้ง L1 มี 4 เหรียญ และ L2 มี 5 เหรียญ เราจึงนำเหรียญ 5 เหรียญจาก L2 และเรามี 5+5=10 เหรียญ ซึ่งสูงสุด

แนวทางที่ใช้ในโปรแกรมด้านล่างมีดังนี้

  • เรามีล็อกเกอร์ L1 และ L2 สองตัวเป็นจำนวนเต็มพร้อมเหรียญ

  • ฟังก์ชัน maxMoney(int A, int B) ใช้สำหรับป้อนจำนวนเหรียญในล็อกเกอร์

  • ภายใน maxMoney() เราใช้ 'เงิน' แบบแปรผันเพื่อเก็บจำนวนเงินสูงสุด

  • ในขั้นต้น เงินจะใช้ค่าจาก A หรือ B แล้วแต่จำนวนใดจะมากกว่า (money=A>B?A:B)

  • เปรียบเทียบค่าเงินกับ A หรือ B เพื่อเช็คว่าเหรียญไหนถูกถอนออก

  • ตอนนี้แทนที่คอนเทนเนอร์นั้นด้วย 1 น้อยกว่าจำนวนก่อนหน้า (A-- หรือ B--)

  • อีกครั้งเงินจะเพิ่มมูลค่าจาก A หรือ B แล้วแต่จำนวนใดจะมากกว่า (เงิน+=A>B?A:B)

    ถ้า k น้อยกว่า องค์ประกอบ k ที่เล็กที่สุดก็จะมีผลรวมน้อยที่สุด −
  • ใน D1 เก็บ abs((ผลรวมของอาร์เรย์ทั้งหมด) - (2*ผลรวมขององค์ประกอบอย่างน้อย k)) สองครั้งเพราะผลรวมอาร์เรย์ก็มีองค์ประกอบเหล่านี้เช่นกัน

    หาก k มากกว่าองค์ประกอบ k ที่ใหญ่ที่สุดก็จะมีผลรวมสูงสุด −

  • ใน D2 เก็บ abs((ผลรวมของอาร์เรย์ทั้งหมด) - (2*ผลรวมขององค์ประกอบ 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