a,b represent tips for worker a and b for each order.
n is the number of orders
x is the number of orders worker a can handle
y is the number of orders worker b can handle
This is the code I'm using:
def maxTip(self, a, b, n, x, y):
idx=[[],[],[]]
for i in range(len(a)):
if a[i]>b[i]:
idx[0].append(i)
elif b[i]>a[i]:
idx[1].append(i)
else:
idx[2].append(i)
def findSum(arr):
sum1=0
sum2=0
for index in idx[0]:
sum1 =a[index]
for index in idx[1]:
sum2 =b[index]
return sum1 sum2
i=0
while len(idx[0])<x:
idx[0].append(idx[2][i])
i =1
while len(idx[1])<y and i<len(idx[2]):
idx[1].append(idx[2][i])
i =1
return(findSum(idx))
I am searching through ith index of both lists at the same time to find the relative maximum at that index. If the ith element of a is greater than the ith element of b then that element gets appended to the first subarray of the array defined at the beginning. Similarly, it is done for the larger element of b. The remaining or the equal values are appended to the third sublist. When I need to find the maximum tip, I go through a loop till x to add the elements of the third subarray to the first subarray. When the length is x, I add the rest of the elements to the next subarray. Then I find the sum. It works with some inputs. But it fails most of the time.
I have recently started learning algorithms so this might be a very stupid question for many.
Example:
n=5
x=3
y=3
a=[1,2,3,4,5]
b=[5,4,3,2,1]
Here the maximum sum would be 21. Worker a will take orders 3,4,5 and worker b will take order 1,2. Worker a will get (3 4 5)=12 amount and worker b will get (5 4)=9 and 12 9=21.
What should I do to find the correct output for:
n=7
x=3
y=4
a=[8, 7, 5, 9, 6, 6, 8]
b=[1, 7, 5, 1, 2, 3, 9]
CodePudding user response:
Problem Description
Given two arrays of size N and two integers X and Y indicating the maximum number of elements, one can pick from array A and array B respectively. At each ith turn, either A[i] or B[i] can be picked. The task is to make the selection that results in the maximum possible sum. Note: It is guaranteed that (X Y) ≥ N.
Posted Code
Provides incorrect answers for a simple solution such as:
x, y = 1, 1
a = [10, 100]
b = [1, 1]
n = 2
print(Solution().maxTip(a, b, n, x, y))
# Outputs: 110
Error: the correct answer is 101 (not 110)
Better Solution
Translating to Python the approach from Maximum sum by picking elements from two arrays in order which are in C , and JavaScript
Steps:
- Sort the element pairs according to the absolute difference i.e. |A[i] – B[i]| in decreasing order.
- Compare A[i] and B[i] value, the one which is greater adds that value to the sum.
- Decrement X by one if the element is chosen from A[i] else decrement Y by one.
- If x is out or y is out add min(A[i], B[i]) to sum
Code
class Solution:
def maxTip(self, a, b, n, x, y):
"""
: a - can pick either from array a
: b or array b on each turn
: n - length of a & b
: x - number of times can pick from a
: y - number of times can pick from b
"""
# Step 1: Sort the element pairs according to the absolute differenc
ab_pairs = sorted([p for p in zip(a, b)], # sequence of a, b pairs formed by zip(a, b)
key = lambda kv: abs(kv[0] - kv[1]), # sorting pairs based upon absolute difference
reverse = True) # sort in non-ascending order
tsum = 0
for ai, bi in ab_pairs:
if ai > bi and x > 0: # 2. Compare A[i] and B[i] value,
tsum = ai # the one which is greater adds that value to the sum.
x -= 1 # 3. Decrement X by one if the element is chosen from A[i]
elif bi > ai and y > 0: # 2. Compare A[i] and B[i] value,
tsum = bi # the one which is greater adds that value to the sum.
y -= 1 # 3. else decrement Y by one.
else:
tsum = min(ai, bi) # 4. If x is out or y is out add min(A[i], B[i]) to sum
return tsum
Test
n=7
x=3
y=4
a=[8, 7, 5, 9, 6, 6, 8]
b=[1, 7, 5, 1, 2, 3, 9]
print(Solution().maxTip(a, b, n, x, y)
# Output: 47
