You are given two integer arrays, skill and mana, of length n and m, respectively.
In a laboratory, n wizards must brew m potions in order. Each potion has a mana capacity mana[j] and must pass through all the wizards sequentially to be brewed properly. The time taken by the ith wizard on the jth potion is timeij = skill[i] * mana[j].
Since the brewing process is delicate, a potion must be passed to the next wizard immediately after the current wizard completes their work. This means the timing must be synchronized so that each wizard begins working on a potion exactly when it arrives.
Return the minimum amount of time required for the potions to be brewed properly.
Input: skill =[1,5,2,4], mana =[5,1,4,2]Output: 110
Explanation:
Potion Number
Start time
Wizard 0 done by
Wizard 1 done by
Wizard 2 done by
Wizard 3 done by
0
0
5
30
40
60
1
52
53
58
60
64
2
54
58
78
86
102
3
86
88
98
102
110
As an example for why wizard 0 cannot start working on the 1st potion before time t = 52, consider the case where the wizards started preparing the 1st potion at time t = 50. At time t = 58, wizard 2 is done with the 1st potion, but wizard 3 will still be working on the 0th potion till time t = 60.
Input: skill =[1,1,1], mana =[1,1,1]Output: 5Explanation:
1. Preparation of the 0th potion begins at time `t = 0`, and is completed by time `t = 3`.2. Preparation of the 1st potion begins at time `t = 1`, and is completed by time `t = 4`.3. Preparation of the 2nd potion begins at time `t = 2`, and is completed by time `t = 5`.
We need to find the minimum time for m potions to be brewed sequentially by n wizards, where each wizard processes each potion in order. Each wizard i takes skill[i] * mana[j] time for potion j, and synchronization means a wizard must wait for the previous wizard to finish before starting. The goal is to efficiently compute the total brewing time using a prefix sum array (skillSum) to track cumulative skill and minimize waiting time.
classSolution {
publiclongminTime(int[] skill, int[] mana) {
int n = skill.length, m = mana.length;
long[] skillSum =newlong[n];
skillSum[0]= skill[0];
for (int i = 1; i < n; ++i)
skillSum[i]= skillSum[i - 1]+ skill[i];
long totalTime = skill[0]* 1L * mana[0];
for (int j = 1; j < m; ++j) {
long maxWait = skill[0]* 1L * mana[j];
for (int i = 1; i < n; ++i) {
long wait = skillSum[i]* mana[j - 1]- skillSum[i - 1]* mana[j];
if (wait > maxWait) maxWait = wait;
}
totalTime += maxWait;
}
return totalTime + skillSum[n - 1]* mana[m - 1];
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
funminTime(skill: IntArray, mana: IntArray): Long {
val n = skill.size; val m = mana.size
val skillSum = LongArray(n)
skillSum[0] = skill[0].toLong()
for (i in1 until n) skillSum[i] = skillSum[i-1] + skill[i]
var totalTime = skill[0].toLong() * mana[0]
for (j in1 until m) {
var maxWait = skill[0].toLong() * mana[j]
for (i in1 until n) {
val wait = skillSum[i] * mana[j-1] - skillSum[i-1] * mana[j]
if (wait > maxWait) maxWait = wait
}
totalTime += maxWait
}
return totalTime + skillSum[n-1] * mana[m-1]
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
defminTime(self, skill: list[int], mana: list[int]) -> int:
n, m = len(skill), len(mana)
skillSum = [skill[0]] + [0]*(n-1)
for i in range(1, n):
skillSum[i] = skillSum[i-1] + skill[i]
totalTime = skill[0] * mana[0]
for j in range(1, m):
maxWait = skill[0] * mana[j]
for i in range(1, n):
wait = skillSum[i] * mana[j-1] - skillSum[i-1] * mana[j]
if wait > maxWait:
maxWait = wait
totalTime += maxWait
return totalTime + skillSum[n-1] * mana[m-1]