给定一个数字,里面是每个人的level,每次可以处理同一个level的2个或者3个任务。求出最小的处理次数。
要求次数最小,那么肯定是每次尽可能多的处理任务。如果某个level的任务只有1个,那么就直接返回-1.
其他的情况就是,如果某个level的任务数量a是3的倍数,那么就直接+a/3即可。
对于a%3=1的情况,例如4 = 2+2
, 7 = 3+2+2
, 10 = 3+3+2+2
所以次数= (a-4)/3+2
对于a%3=3的情况,例如5=3+2, 8 = 3+3+2, 11=3+3+3+2所以次数 = a/3+1
实现代码如下
func minimumRounds(tasks []int) int {
taskLevel := make(map[int]int)
for _, t := range tasks {
taskLevel[t]++
}
rounds := 0
for _, count := range taskLevel {
if count == 1 {
return -1
}
cond := count % 3
if cond == 0 {
rounds += count / 3
continue
}
// 4(2+2), 7(3+2+2), 10(3+3+2+2), 13(3+3+3+2+2)
if cond == 1 {
rounds += (count-4)/3 + 2
continue
}
// 5(3+2), 8(3+3+2), 11(3+3+3+2)
rounds += count/3 + 1
}
return rounds
}