You are presented with a rectangular cake whose sides are of length X and Y. The cake has been cut into (N + 1)2 pieces by making N straight cuts along the first side and N straight cuts along the second side.
The cuts are represented by two non-empty arrays A and B consisting of N integers. More precisely, A[I] such that 0 ≤ I < N represents the position of a cut along the first side, and B[I] such that 0 ≤ I < N represents the position of a cut along the second side.
The goal is to find the K-th piece of cake in order of size, starting with the largest piece first. We will consider the size of a piece to be its area.
For example, a cake with sides X = 6, Y = 7 and arrays A and B such that:
A[0] = 1 B[0] = 1 A[1] = 3 B[1] = 5is represented by the figure below.
There are nine pieces of cake, and their consecutive sizes are: 12, 8, 6, 4, 4, 3, 2, 2, 1. In the figure above, the third piece of cake is highlighted; its size equals 6.
Write a function:
def solution(X, Y, K, A, B)
that, given three integers X, Y, K and two non-empty arrays A and B of N integers, returns the size of the K-th piece of cake.
For example, given:
X = 6 Y = 7 K = 3 A[0] = 1 B[0] = 1 A[1] = 3 B[1] = 5the function should return 6, as explained above.
Write an efficient algorithm for the following assumptions:
- N is an integer within the range [1..40,000];
- X and Y are integers within the range [2..400,000,000];
- K is an integer within the range [1..(N+1)*(N+1)];
- each element of array A is an integer within the range [1..X-1];
- each element of array B is an integer within the range [1..Y-1];
- A[I − 1] < A[I] and B[I − 1] < B[I], for every I such that 0 < I < N;
- 1 ≤ A[I] − A[I − 1], B[I] − B[I − 1] ≤ 10,000, for every I such that 0 < I < N;
- 1 ≤ A[0], B[0], X − A[N − 1], Y − B[N − 1] ≤ 10,000.
Invalid result type, int expected, <type 'NoneType'> found.
# you can use print for debugging purposes, e.g.
# print "this is a debug message"
def solution(X, Y, K, A, B):
# write your code in Python 2.7
xSizes = [0 for i in range(len(A) + 1)]
prevX = 0
for i in range(0, len(A), 1):
xSizes[i] = A[i] - prevX;
prevX = A[i]
xSizes[len(A)] = X - prevX
xSizes.sort()
ySizes = [0 for i in range(len(B) + 1)]
prevY = 0
for i in range(0, len(B), 1):
ySizes[i] = B[i] - prevY;
prevY = B[i]
ySizes[len(B)] = Y - prevY
ySizes.sort()
max = xSizes[len(A)] * ySizes[len(A)]
min = xSizes[0] * ySizes[0]
left = min
right = max
while(left <= right):
mid = (right - left) // 2 + left
result = larger(xSizes, ySizes, mid)
if(result[0] > K - 1):
left = mid + 1
elif result[0] + result[1] < K:
right = mid - 1;
else:
return mid
return -1
def larger(xSizes, ySizes, N):
larger = 0
equal = 0
i = len(xSizes) - 1
j = 0
while (i >= 0 and j < len(ySizes)):
x = xSizes[i]
y = ySizes[j]
area = x * y
if(area == N):
tempi = i
while(tempi >= 0 and xSizes[tempi] == xSizes[i]):
tempi = tempi - 1
tempj = j
while(tempj < len(ySizes) and ySizes[tempj] == ySizes[j]):
tempj = tempj + 1
equal += (i - tempi) * (tempj - j)
j = tempj
pass
elif (area > N):
larger += (len(ySizes) - j)
i = i - 1
pass
else:
j = j + 1
pass
pass
return (larger, equal)
# you can use print for debugging purposes, e.g.
# print "this is a debug message"
def solution(X, Y, K, A, B):
# write your code in Python 2.7
xSizes = [0 for i in range(len(A) + 1)]
prevX = 0
for i in range(0, len(A), 1):
xSizes[i] = A[i] - prevX;
prevX = A[i]
xSizes[len(A)] = X - prevX
xSizes.sort()
ySizes = [0 for i in range(len(B) + 1)]
prevY = 0
for i in range(0, len(B), 1):
ySizes[i] = B[i] - prevY;
prevY = B[i]
ySizes[len(B)] = Y - prevY
ySizes.sort()
max = xSizes[len(A)] * ySizes[len(A)]
min = xSizes[0] * ySizes[0]
left = min
right = max
while(left <= right):
mid = (right - left) // 2 + left
result = larger(xSizes, ySizes, mid)
if(result[0] > K - 1):
left = mid + 1
elif result[0] + result[1] < K:
right = mid - 1;
else:
return mid
return -1
def larger(xSizes, ySizes, N):
larger = 0
equal = 0
i = len(xSizes) - 1
j = 0
while (i >= 0 and j < len(ySizes)):
x = xSizes[i]
y = ySizes[j]
area = x * y
if(area == N):
tempi = i
while(tempi >= 0 and xSizes[tempi] == xSizes[i]):
tempi = tempi - 1
tempj = j
while(tempj < len(ySizes) and ySizes[tempj] == ySizes[j]):
tempj = tempj + 1
equal += (i - tempi) * (tempj - j)
j = tempj
pass
elif (area > N):
larger += (len(ySizes) - j)
i = i - 1
pass
else:
j = j + 1
pass
pass
return (larger, equal)
# you can use print for debugging purposes, e.g.
# print "this is a debug message"
def solution(X, Y, K, A, B):
# write your code in Python 2.7
xSizes = [0 for i in range(len(A) + 1)]
prevX = 0
for i in range(0, len(A), 1):
xSizes[i] = A[i] - prevX;
prevX = A[i]
xSizes[len(A)] = X - prevX
xSizes.sort()
ySizes = [0 for i in range(len(B) + 1)]
prevY = 0
for i in range(0, len(B), 1):
ySizes[i] = B[i] - prevY;
prevY = B[i]
ySizes[len(B)] = Y - prevY
ySizes.sort()
max = xSizes[len(A)] * ySizes[len(A)]
min = xSizes[0] * ySizes[0]
left = min
right = max
while(left <= right):
mid = (right - left) // 2 + left
result = larger(xSizes, ySizes, mid)
if(result[0] > K - 1):
left = mid + 1
elif result[0] + result[1] < K:
right = mid - 1;
else:
return mid
return -1
def larger(xSizes, ySizes, N):
larger = 0
equal = 0
i = len(xSizes) - 1
j = 0
while (i >= 0 and j < len(ySizes)):
x = xSizes[i]
y = ySizes[j]
area = x * y
if(area == N):
tempi = i
while(tempi >= 0 and xSizes[tempi] == xSizes[i]):
tempi = tempi - 1
tempj = j
while(tempj < len(ySizes) and ySizes[tempj] == ySizes[j]):
tempj = tempj + 1
equal += (i - tempi) * (tempj - j)
j = tempj
pass
elif (area > N):
larger += (len(ySizes) - j)
i = i - 1
pass
else:
j = j + 1
pass
pass
return (larger, equal)
The solution obtained perfect score.