使用kotlin解决这个题目:1090. 受标签影响的最大值 提示 中等 51 相关企业 我们有一个 n 项的集合。给出两个整数数组 values 和 labels ,第 i 个元素的值和标签分别是 values[i] 和 labels[i]。还会给出两个整数 numWanted 和 useLimit 。 从 n 个元素中选择一个子集 s : 子集 s 的大小 小于或等于 numWanted 。 s 中 最多 有相同标签的 useLimit 项。 一个子集的 分数 是该子集的值之和。 返回子集 s 的最大 分数 。 示例 1: 输入:values = [5,4,3,2,1], labels = [1,1,2,2,3], numWanted = 3, useLimit = 1 输出:9 解释:选出的子集是第一项,第三项和第五项。 示例 2: 输入:values = [5,4,3,2,1], labels = [1,3,3,3,2], numWanted = 3, useLimit = 2 输出:12 解释:选出的子集是第一项,第二项和第三项。 示例 3: 输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], numWanted = 3, useLimit = 1 输出:16 解释:选出的子集是第一项和第四项。
时间: 2023-07-02 22:04:25 浏览: 167
kotlin-frontend-plugin:用于前端开发的Gradle Kotlin(http:kotlinlang.org)插件
```kotlin
fun largestValsFromLabels(values: IntArray, labels: IntArray, numWanted: Int, useLimit: Int): Int {
val n = values.size
val pairs = Array(n) { Pair(values[it], labels[it]) }
pairs.sortByDescending { it.first } // 按值从大到小排序
val used = mutableMapOf<Int, Int>() // 记录每个标签已经使用的次数
var ans = 0
var cnt = 0
for (pair in pairs) {
if (cnt == numWanted) break // 已选够 numWanted 个元素
if (used.getOrDefault(pair.second, 0) < useLimit) { // 当前标签还能用
ans += pair.first
used[pair.second] = used.getOrDefault(pair.second, 0) + 1
cnt++
}
}
return ans
}
```
阅读全文