
2026-04-18:选择 K 个任务的最大总分数。用go语言,给定两个长度为 n 的整数数组 A 和 B,表示 n 个任务分别用两种技巧完成时的得分。
第 i 个任务:
再给定整数 k,要求你至少要有 k 个任务使用技巧 1 完成(这 k 个任务不要求是连续的或前面的任意位置)。其余任务可以任意选择技巧 1 或技巧 2。
目标是:在满足“技巧 1 的任务数不少于 k”的前提下,选择每个任务使用哪种技巧,使总得分尽可能大。
输出这个最大可能的总分数。
1 <= n == technique1.length == technique2.length <= 100000。
1 <= technique1[i], technique2[i] <= 100000。
0 <= k <= n。
输入:technique1 = [5,2,10], technique2 = [10,3,8], k = 2。
输出:22。
解释:
我们必须使用 technique1 完成至少 k = 2 个任务。
选择 technique1[1] 和 technique1[2](使用技巧 1 完成),以及 technique2[0](使用技巧 2 完成),可以获得最大分数:2 + 10 + 10 = 22。
题目来自力扣3767。
核心思路:在保证至少k个任务用技巧1的前提下,把部分任务从技巧1换成技巧2,如果替换后分数变高,就替换。
收益 = B[i](技巧2分数) - A[i](技巧1分数)[5, 1]约束:必须保留至少k个任务用技巧1,总任务数n=3。
[5, 1] 排序后还是 [5, 1]最终最大总分数为22,和题目示例答案一致。
B[i]-A[i],只保留大于0的收益(只有替换能加分的才考虑)。.
package main
import (
"fmt"
"slices"
)
func maxPoints(a, b []int, k int) (ans int64) {
n := len(a)
d := a[:0]
for i, x := range a {
ans += int64(x)
v := b[i] - x
if v > 0 {
d = append(d, v)
}
}
slices.SortFunc(d, func(a, b int)int { return b - a })
for _, x := range d[:min(n-k, len(d))] {
ans += int64(x)
}
return
}
func main() {
technique1 := []int{5, 2, 10}
technique2 := []int{10, 3, 8}
k := 2
result := maxPoints(technique1, technique2, k)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def max_points(a, b, k):
ans = sum(a)
n = len(a)
d = []
for x, y in zip(a, b):
v = y - x
if v > 0:
d.append(v)
d.sort(reverse=True)
limit = min(n - k, len(d))
for i in range(limit):
ans += d[i]
return ans
def main():
technique1 = [5, 2, 10]
technique2 = [10, 3, 8]
k = 2
result = max_points(technique1, technique2, k)
print(result)
if __name__ == "__main__":
main()
.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
long long maxPoints(const vector<int>& a, const vector<int>& b, int k) {
long long ans = accumulate(a.begin(), a.end(), 0LL);
int n = a.size();
vector<int> d;
for (int i = 0; i < n; i++) {
int v = b[i] - a[i];
if (v > 0) {
d.push_back(v);
}
}
sort(d.begin(), d.end(), greater<int>());
int limit = min(n - k, (int)d.size());
for (int i = 0; i < limit; i++) {
ans += d[i];
}
return ans;
}
int main() {
vector<int> technique1 = {5, 2, 10};
vector<int> technique2 = {10, 3, 8};
int k = 2;
long long result = maxPoints(technique1, technique2, k);
cout << result << endl;
return0;
}

我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。
·