Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C에서 2단계로 인출할 수 있는 최대 금액


우리는 L1과 L2라고 하는 두 개의 로커에 동전 형태로 일정량의 돈이 있습니다. L1에는 A 동전이 있고 L2에는 B 동전이 있습니다. 인출한 돈이 최대가 되도록 로커에서 돈이나 동전을 인출해야 합니다. 모든 사물함에서 동전을 꺼낼 때마다 이전 개수보다 1 적은 동전으로 교체됩니다. L1에서 A 동전을 뽑으면 A-1 동전으로 대체되고 L2에서 B 동전을 뽑으면 B-1 동전으로 대체됩니다. 과제는 두 단계로 인출된 금액을 최대화하는 것입니다. 즉, 코인은 두 번만 인출할 수 있습니다.

입력 − L1 - 10, L2 - 11

출력 −2단계로 인출할 수 있는 최대 금액 − 21

설명 − 1단계에서 L2에서 11개의 코인을 인출하고 L2는 11-1=10개의 코인으로 대체됩니다.

2단계에서 L1과 L2 모두 10개의 코인을 가지고 있으므로 어느 곳에서나 인출할 수 있으며 최대 11+10=21개의 코인이 있습니다.

입력 − L1-5, L2-5

출력 −2단계로 인출할 수 있는 최대 금액 − 10

설명 − 1단계에서 L1에서 5개의 코인을 인출하고 L1은 5-1=4개의 코인으로 대체됩니다.

2단계에서 L1에는 4개의 동전이 있고 L2에는 5개의 동전이 있으므로 L2에서 5개의 동전을 가져오고 최대값인 5+5=10개의 동전이 있습니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

  • 몇 개의 동전이 있는 정수로 두 개의 보관함 L1과 L2가 있습니다.

  • 함수 maxMoney(int A, int B)는 사물함에 있는 동전의 수를 입력으로 받습니다.

  • maxMoney() 내부에서 최대 금액을 저장하기 위해 변수 'money'를 사용합니다.

  • 처음에 돈은 A 또는 B 중 더 큰 값을 취합니다.(money=A>B?A:B)

  • 돈의 가치를 A, B와 비교하여 어떤 컨테이너의 코인이 출금되었는지 확인하세요.

  • 이제 해당 컨테이너를 이전 금액보다 1 적은 값으로 바꿉니다. (A-- 또는 B--)

  • 다시 돈은 A 또는 B 중 더 큰 값을 추가합니다. (돈+=A>B?A:B)

    k가 더 작은 경우 가장 작은 k 요소는 최소 합을 갖습니다 -
  • D1에 abs((전체 배열의 합) - (2*최소 k 요소의 합))을 저장합니다. 배열 sum에도 이러한 요소가 있기 때문에 두 번.

    k가 더 크면 가장 큰 k 요소는 가장 높은 합을 갖습니다 -

  • D2에 abs((전체 배열의 합) - (2*가장 높은 k 요소의 합))을 저장합니다. 배열 sum에도 이러한 요소가 있기 때문에 두 번.

  • 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