LCP 40. 心算挑战

心算挑战

解法一: 前缀和, 贪心

go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
func maxmiumScore(cards []int, cnt int) int {
// 奇偶分组
odds := []int{}
evens := []int{}
for _, card := range cards {
if (card & 1) == 0 {
evens = append(evens, card)
} else {
odds = append(odds, card)
}
}
// 排序,在数组最后多插入一个 0,方便后续计算
n1 := len(odds)
sort.Ints(odds)
for i := n1 - 2; i >= 0; i-- {
odds[i] += odds[i+1]
}
odds = append(odds, 0)

n2 := len(evens)
sort.Ints(evens)
for i := n2 - 2; i >= 0; i-- {
evens[i] += evens[i+1]
}
evens = append(evens, 0)
// 假设奇数数量为 oddNum,偶数数量为 evenNum
// 最后相加的结果要得到偶数,奇数的数量需要满足 oddNum % 2 == 0,那么偶数的数量就是 cnt - oddNum
// 为了得到最大的总和,需要枚举所有满足的奇偶组合,取最大值为最后的结果
ans := 0
for oddNum := 0; oddNum <= n1 && oddNum <= cnt; oddNum += 2 {
evenNum := cnt - oddNum
if evenNum < 0 {
break
} else if evenNum > n2 {
continue
}
curSum := 0
curSum += odds[n1-oddNum]
curSum += evens[n2-evenNum]
ans = max(ans, curSum)
}
return ans
}
作者

wuhunyu

发布于

2024-08-01

更新于

2025-01-15

许可协议