When life gives you lemons, make a quiz team!
Hi! I'm Asparagos - an asparagus who codes in Go. Here you’ll find everyday problems that a typical veggie might struggle with — and my Go solutions to them. Today we are solving the problem of Lemon Squeezy 🍋.
Problem
Summer is over, lemonade is out of fashion, but the lemons refuse to waste time. They've formed a team called "Lemon Squeezy" and are aiming to win the annual pub quiz.
Now they must decide who joins the team. Each lemon has two attributes: IQ and age. They want a team with the maximum total IQ. But lemons have fragile citrus egos: no lemon will play in a team with a younger lemon who has a higher IQ.
Can they quickly figure out who should be in the team? And what will the total IQ of "Lemon Squeezy" be?
Input 🍊
iqs []int - IQ of each lemon.
ages []int - age of each lemon.
Output 🍐
An integer — the maximum total IQ of a team with no conflicts. A conflict exists if a younger lemon has a higher IQ than the older lemon. Lemons of the same age never conflict, regardless of IQ.
Examples 🍈:
-
Example 1
Input:
iqs = [1, 2, 3], ages = [10, 15, 20]Output:
6All lemons can be in the same team.
-
Example 2
Input:
iqs = [4, 9, 20], ages = [20, 10, 15]Output:
29The team consists of the second and third lemons. The first lemon can’t be included because its
IQ = 4is lower than the IQ of the second lemon, who is younger. -
Example 2
Input:
iqs = [17, 24, 50], ages = [46, 37, 5]Output:
50The team consists of a single lemon — the last one. Any other combination would include a younger lemon with a higher IQ than an older lemon, causing a conflict.
Solution 💡
First, we sort all lemons by age. If two lemons have the same age, we sort them by IQ. We also create a slice
teamIQs, whereteamIQs[i]is the maximum total IQ of the team that contains the lemon at indexi.We iterate through the sorted lemons. For each lemon, we first set
teamIQs[i]to the current lemon's IQ: at least the team consisting of just thei-th lemon is valid.-
For each lemon, we iterate through all previous lemons and try to find a previous team to which the current lemon can be added without conflicts.
In the team at index
prevInd, the lemon with the maximum IQ is the lemon atprevInd(otherwise that lemon could not have been added, because it would be older with a smaller IQ, given our sorting).Therefore, if the current lemon's IQ is greater than or equal to the
prevIndlemon's IQ, we can add the current lemon toteamIQs[prevInd]without conflicts. Among all such possible teams, we take the one with the maximum total IQ. As we go, we update
maxTeamIQ— the maximum total IQ over all conflict-free teams.
type Lemon struct {
iq int
age int
}
func findBestTeamIQ(iqs []int, ages []int) int {
lemons := make([]Lemon, len(iqs))
for i, iq := range iqs {
lemons[i] = Lemon{iq: iq, age: ages[i]}
}
slices.SortFunc(lemons, func(a, b Lemon) int {
if a.age == b.age {
return cmp.Compare(a.iq, b.iq)
}
return cmp.Compare(a.age, b.age)
})
teamIQs := make([]int, len(lemons))
maxTeamIQ := 0
for i, lemon := range lemons {
teamIQs[i] = lemon.iq
for prevInd := 0; prevInd < i; prevInd++ {
if lemons[prevInd].iq > lemon.iq {
continue
}
newIQ := teamIQs[prevInd] + lemon.iq
if newIQ > teamIQs[i] {
teamIQs[i] = newIQ
}
}
if teamIQs[i] > maxTeamIQ {
maxTeamIQ = teamIQs[i]
}
}
return maxTeamIQ
}
Feel free to check out the full code with tests on GitHub, and don’t hesitate to leave a ⭐ if you find it helpful!
Top comments (0)