우리는 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