你的位置:滚球app官方网站 > 波胆下注 > 滚球app官网 2026-04-18: 接收 K 个任务的最大总分数。用go言语, 给定两个长度
滚球app官网 2026-04-18: 接收 K 个任务的最大总分数。用go言语, 给定两个长度
发布日期:2026-04-21 05:09    点击次数:137

滚球app官网 2026-04-18: 接收 K 个任务的最大总分数。用go言语, 给定两个长度

2026-04-18:接收 K 个任务的最大总分数。用go言语,给定两个长度为 n 的整数数组 A 和 B,暗意 n 个任务分辩用两种手段完成时的得分。

第 i 个任务:

• 接收手段 1,可得 A[i] 分

• 接收手段 2,可得 B[i] 分

再给定整数 k,条件你至少要有 k 个任务使用手段 1 完成(这 k 个任务不条件是诱惑的或前边的随心位置)。其余任务不错随心接收手段 1 或手段 2。

目的是:在悠闲“手段 1 的任务数不少于 k”的前提下,接收每个任务使用哪种手段,使总得分尽可能大。

输出这个最大可能的总分数。

1

1

0

输入: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。

算法引申阵势详备见识(持续题目与示例)

第一步:基础分数启动化(全选手段1)

1. 门径:题目条件至少k个任务用手段1,最基础的决策是总共任务齐用手段1,先盘算这个基础总分。

2. 盘算:

A数组总共元素乞降:5 + 2 + 10 = 17

3. 此时悠闲敛迹:3个任务齐用手段1,庞杂于k=2的条件。

第二步:盘算「替换收益」,筛选正向收益

中枢想路:在保证至少k个任务用手段1的前提下,把部分任务从手段1换成手段2,若是替换后分数变高,就替换。

1. 界说收益:第i个任务,收益 = B[i](手段2分数) - A[i](手段1分数)

• 收益>0:换成手段2,总分会加多

• 收益≤0:换成手段2,总分不变/减少,不替换

2. 一一盘算收益:

• 任务0:10-5=5(收益>0,滚球app官网纪录)

• 任务1:3-2=1(收益>0,纪录)

• 任务2:8-10=-2(收益

3. 得到正向收益列表:[5, 1]

第三步:笃信最多能替换的任务数目

敛迹:必须保留至少k个任务用手段1,总任务数n=3。

1. 最多可替换数目 = 总任务数 - 必须保留的手段1任务数 = n - k = 3-2 = 1个

2. 含义:咱们最多只可把1个任务从手段1换成手段2,剩下2个必须用手段1。

第四步:优先接收收益最高的替换(盘臆想谋)

1. 对正向收益列表从大到小排序:[5, 1] 排序后已经 [5, 1]

2. 登第前「最多可替换数目」个收益(即前1个):收益5

3. 把这个收益加到基础总分上:17 + 5 = 22

第五步:得到最终牺牲

最终最大总分数为22,和题目示例谜底一致。

通用竣工经过(适用于总共输入)

1. 基础总分盘算

遍历数组A,累加总共元素得到基础总分(默许总共任务用手段1,悠闲敛迹)。

2. 生成正向收益列表

遍历每个任务,盘算B[i]-A[i],只保留大于0的收益(惟一替换能加分的才辩论)。

3. 排序收益

将正向收益列表从大到小降序排序(盘算:优先替换收益最高的任务)。

4. 盘算可替换上限

最多能替换的任务数 = 总任务数n - 最少需要的手段1任务数k。

5. 累加最优收益

取排序后收益列表中,前「可替换上限」个收益,一齐加到基础总分上。

6. 输出牺牲

最终的和即是悠闲敛迹的最大总分数。

复杂度分析

1. 时刻复杂度

• 遍历数组盘算基础总分、生成收益列表:O(n)

• 对收益列表排序:收益列表长度最大为n,排序时刻O(n log n)

• 遍历收益列表累加:O(n)

• 总时刻复杂度:O(n log n)

(这是处分n≤10⁵领域数据的最优解法之一)

2. 零碎空间复杂度

• 仅创建了一个存储正向收益的切片,最大长度为n

• 无其他递归/大型数据结构

• 总和外空间复杂度:O(n)

转头

1. 中枢逻辑:基础分(全手段1)+ 最优替换收益,用盘算保证分数最大化;

2. 严格悠闲「至少k个手段1」的敛迹;

3. 时刻复杂度O(n log n),空间复杂度O(n),适配题目10万级数据领域。

Go竣工代码如下:

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)

}

Python竣工代码如下:

# -*-coding:utf-8-*-

def max_points(a, b, k):

ans = sum(a)

n = len(a)

d = []

for x, y in zip(a, b):

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

C++竣工代码如下:

#include

#include

#include

#include

using namespace std;

long long maxPoints(const vector& a, const vector& b, int k) {

long long ans = accumulate(a.begin, a.end, 0LL);

int n = a.size;

vector d;

for (int i = 0; i

int v = b[i] - a[i];

if (v > 0) {

d.push_back(v);

}

}

sort(d.begin, d.end, greater);

int limit = min(n - k, (int)d.size);

for (int i = 0; i

ans += d[i];

}

return ans;

}

int main {

vector technique1 = {5, 2, 10};

vector technique2 = {10, 3, 8};

int k = 2;

long long result = maxPoints(technique1, technique2, k);

cout

return0;

}

咱们信托东说念主工智能为平时东说念主提供了一种“增强器具”,并长途于共享全办法的AI学问。在这里,您不错找到最新的AI科普著作、器具评测、晋升成果的阴私以及行业知悉。

迎接见谅“福大大架构师逐日一题”,发音信可获取口试尊府滚球app官网,让AI助力您的将来发展。

开云体育(kaiyun)官网