2025-01-18:施咒的最大总伤害。用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组 power 中,其中可能会有多个咒语具有相同的伤害值。 使用某个特定伤

news/2025/1/18 12:34:05/文章来源:https://www.cnblogs.com/moonfdd/p/18678341

2025-01-18:施咒的最大总伤害。用go语言,一个魔法师掌握了多种不同的咒语,每个咒语对应一个伤害值,这些伤害值存储在数组 power 中,其中可能会有多个咒语具有相同的伤害值。

使用某个特定伤害值为 power[i] 的咒语后,魔法师不能再使用伤害值为 power[i] - 2、power[i] - 1、power[i] + 1 或 power[i] + 2 的任何咒语。此外,每个咒语只能被施放一次。

请你计算并返回魔法师能够实现的最大伤害值总和。

1 <= power.length <= 100000。

1 <= power[i] <= 1000000000。

输入:power = [7,1,6,6]。

输出:13。

解释:

可以使用咒语 1,2,3,伤害值分别为 1,6,6,总伤害值为 13 。

答案2025-01-18:

chatgpt

题目来自leetcode3186。

大体步骤如下:

1.在 main 函数中,定义了输入的 power 数组,然后调用 maximumTotalDamage 函数,并打印最终结果。

2.在 maximumTotalDamage 函数中,首先使用一个 map 统计每种攻击力出现的次数,并将不同的攻击力存储到一个切片中,并进行排序。

3.使用动态规划的方法计算最大伤害值总和。创建一个数组 dp 用于存储计算过程中的最大伤害值总和,然后遍历排序后的攻击力数组。

4.对于每个攻击力,根据规则选择是否使用当前攻击力,并更新最大伤害值总和。

5.最终返回 dp[n+2],即最大伤害值总和。

总的时间复杂度:

  • 统计每种攻击力的出现次数时间复杂度为 O(n)。

  • 将不同的攻击力进行排序的时间复杂度为 O(nlogn)。

  • 最大伤害值总和的动态规划过程时间复杂度为 O(n)。

  • 所以总的时间复杂度为 O(n + nlogn)。

总的额外空间复杂度:

  • 除了 power 数组外,在统计每种攻击力的出现次数、排序和动态规划过程中额外使用的空间为 O(n)。

  • 所以总的额外空间复杂度为 O(n)。

综上,总的时间复杂度为 O(nlogn),总的额外空间复杂度为 O(n)。

Go完整代码如下:

package mainimport ("fmt""sort"
)func maximumTotalDamage(power []int) int64 {// 统计每种攻击力的出现次数cnt := make(map[int]int)for _, p := range power {cnt[p]++}// 将不同的攻击力存储到一个切片并排序powers := make([]int, 0, len(cnt))for p := range cnt {powers = append(powers, p)}sort.Ints(powers)n := len(powers)// dp数组多开几个空间防止下标越界dp := make([]int64, n+3)for i := 0; i < n; i++ {x := powers[i]// 继承不选当前值的情况dp[i+3] = dp[i+2]// 选择当前值x,并处理不同的跳过情况if _, ok1 := cnt[x-2]; ok1 && cnt[x-1] > 0 {dp[i+3] = max(dp[i+3], dp[i]+int64(x)*int64(cnt[x]))} else if ok1 || cnt[x-1] > 0 {dp[i+3] = max(dp[i+3], dp[i+1]+int64(x)*int64(cnt[x]))} else {dp[i+3] += int64(x) * int64(cnt[x])}}return dp[n+2]
}func main() {power := []int{7, 1, 6, 6}result := maximumTotalDamage(power)fmt.Println(result)
}

在这里插入图片描述

Rust完整代码如下:

use std::collections::HashMap;fn maximum_total_damage(power: Vec<i32>) -> i64 {// 统计每种攻击力的出现次数let mut cnt = HashMap::new();for &p in &power {*cnt.entry(p).or_insert(0) += 1;}// 将不同的攻击力存储到一个 Vec 中并排序let mut powers: Vec<i32> = cnt.keys().cloned().collect();powers.sort();let n = powers.len();// dp数组多开几个空间防止下标越界let mut dp = vec![0; n + 3];for i in 0..n {let x = powers[i];// 继承不选当前值的情况dp[i + 3] = dp[i + 2];// 选择当前值 x,并处理不同的跳过情况if cnt.contains_key(&(x - 2)) && cnt.contains_key(&(x - 1)) {dp[i + 3] = dp[i + 3].max(dp[i] + x as i64 * cnt[&x] as i64);} else if cnt.contains_key(&(x - 2)) || cnt.contains_key(&(x - 1)) {dp[i + 3] = dp[i + 3].max(dp[i + 1] + x as i64 * cnt[&x] as i64);} else {dp[i + 3] += x as i64 * cnt[&x] as i64;}}dp[n + 2]
}fn main() {let power = vec![7, 1, 6, 6];let result = maximum_total_damage(power);println!("{}", result);
}

在这里插入图片描述

C完整代码如下:

#include <stdio.h>
#include <stdlib.h>#define MAX_POWERS 1000 // 假设最大的咒语伤害值不会超过1000// 比较函数用于 qsort
int compare(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}// 计算最大总伤害
long long maximumTotalDamage(int *power, int size) {int cnt[MAX_POWERS] = {0}; // 统计每种攻击力的出现次数for (int i = 0; i < size; i++) {cnt[power[i]]++;}int powers[MAX_POWERS];int n = 0;// 将不同的攻击力存储到数组并排序for (int i = 0; i < MAX_POWERS; i++) {if (cnt[i] > 0) {powers[n++] = i;}}// 排序qsort(powers, n, sizeof(int), compare);long long dp[n + 3]; // dp数组for (int i = 0; i < n + 3; i++) {dp[i] = 0; // 初始化}for (int i = 0; i < n; i++) {int x = powers[i];// 继承不选当前值的情况dp[i + 3] = dp[i + 2];// 选择当前值x,并处理不同的跳过情况if (cnt[x - 2] > 0 && cnt[x - 1] > 0) {dp[i + 3] = dp[i + 3] > dp[i] + (long long)x * cnt[x] ? dp[i + 3] : (dp[i] + (long long)x * cnt[x]);} else if (cnt[x - 2] > 0 || cnt[x - 1] > 0) {dp[i + 3] = dp[i + 3] > dp[i + 1] + (long long)x * cnt[x] ? dp[i + 3] : (dp[i + 1] + (long long)x * cnt[x]);} else {dp[i + 3] += (long long)x * cnt[x];}}return dp[n + 2];
}int main() {int power[] = {7, 1, 6, 6}; // 示例输入int size = sizeof(power) / sizeof(power[0]);long long result = maximumTotalDamage(power, size);printf("%lld\n", result); // 输出结果return 0;
}

在这里插入图片描述

C++完整代码如下:

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>using namespace std;long long maximumTotalDamage(vector<int>& power) {// 统计每种攻击力的出现次数unordered_map<int, int> cnt;for (const auto& p : power) {cnt[p]++;}// 将不同的攻击力存储到一个向量中并排序vector<int> powers;for (const auto& p : cnt) {powers.push_back(p.first);}sort(powers.begin(), powers.end());int n = powers.size();// dp 数组多开几个空间防止下标越界vector<long long> dp(n + 3, 0);for (int i = 0; i < n; i++) {int x = powers[i];// 继承不选当前值的情况dp[i + 3] = dp[i + 2];// 选择当前值 x,并处理不同的跳过情况if (cnt.count(x - 2) && cnt[x - 1] > 0) {dp[i + 3] = max(dp[i + 3], dp[i] + static_cast<long long>(x) * cnt[x]);} else if (cnt.count(x - 2) || cnt[x - 1] > 0) {dp[i + 3] = max(dp[i + 3], dp[i + 1] + static_cast<long long>(x) * cnt[x]);} else {dp[i + 3] += static_cast<long long>(x) * cnt[x];}}return dp[n + 2];
}int main() {vector<int> power = {7, 1, 6, 6}; // 示例输入long long result = maximumTotalDamage(power);cout << result << endl; // 输出结果return 0;
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-from collections import Counterdef maximum_total_damage(power):# 统计每种攻击力的出现次数cnt = Counter(power)# 获取不同的攻击力并排序powers = sorted(cnt.keys())n = len(powers)# dp数组多开几个空间防止下标越界dp = [0] * (n + 3)for i in range(n):x = powers[i]# 不选当前值的情况dp[i + 3] = dp[i + 2]# 选择当前值 x,并处理不同的跳过情况if (x - 2) in cnt and (x - 1) in cnt:dp[i + 3] = max(dp[i + 3], dp[i] + x * cnt[x])elif (x - 2) in cnt or (x - 1) in cnt:dp[i + 3] = max(dp[i + 3], dp[i + 1] + x * cnt[x])else:dp[i + 3] += x * cnt[x]return dp[n + 2]# 示例测试
if __name__ == "__main__":power = [7, 1, 6, 6]result = maximum_total_damage(power)print(result)  # 输出结果

在这里插入图片描述

Javascript完整代码如下:

function maximumTotalDamage(power) {// 统计每种攻击力的出现次数const cnt = {};for (const p of power) {cnt[p] = (cnt[p] || 0) + 1; // 计数}// 将不同的攻击力存储到一个数组并排序const powers = Object.keys(cnt).map(Number);powers.sort((a, b) => a - b);const n = powers.length;// dp数组多开几个空间防止下标越界const dp = new Array(n + 3).fill(0);for (let i = 0; i < n; i++) {const x = powers[i];// 继承不选当前值的情况dp[i + 3] = dp[i + 2];// 选择当前值x,并处理不同的跳过情况if ((x - 2) in cnt && (x - 1) in cnt) {dp[i + 3] = Math.max(dp[i + 3], dp[i] + x * cnt[x]);} else if ((x - 2) in cnt || (x - 1) in cnt) {dp[i + 3] = Math.max(dp[i + 3], dp[i + 1] + x * cnt[x]);} else {dp[i + 3] += x * cnt[x];}}return dp[n + 2];
}// 示例测试
const power = [7, 1, 6, 6];
const result = maximumTotalDamage(power);
console.log(result); // 输出结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/871205.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工具 | todesk最新版设备代码、连接密码读取工具,附下载链接

工具介绍: todesk最新版读取设备代码、连接密码 工具 下载链接: 下载链接: todesk最新版读取设备代码、连接密码 工具下载 使用说明 工具使用效果如图

工具 | Hacking

0x00 简介 Hacking是一款包含多种渗透测试功能的脚本。 下载地址: Hacking下载:Hacking下载 0x01 功能说明Brute ForceDDos AttackNMap PortScannerInstall Tools Hacking注:仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承…

工具 | ApplicationScanner

0x00 简介 ApplicationScanner是一款APP客户端安全项检测工具。 下载地址: ApplicationScanner下载: ApplicationScanner下载 0x01 功能说明APP安全检测注:仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部法律及连带责任,作者及发布者不承担任何法律及连带责…

工具 | WExploit

0x00 简介 WExploit是一款基于java开发的漏洞检测工具。 下载地址 WExploit下载:WExploit下载 0x01 功能说明Struts2ThinkPHP海康威视泛微OA用友OA致远OA红帆OA万户OA宏景OA蓝凌OA广联达OA大华JeecgBoot帆软注:仅供安全研究与学习之用,若将工具做其他用途,由使用者承担全部…

工具 | StarCodeSecurity

0x00 简介 StarCodeSecurity是一款图形化的代码审计工具。 下载地址: StarCodeSecurity下载:StarCodeSecurity下载 0x01 功能说明支持对规则进行增删改查审计文件后缀审计路径关键字禁止审计路径关键字支持java、php、net项目审计注:仅供安全研究与学习之用,若将工具做其他…

工具 | MemShellParty

0x00 简介 MemShellParty是一键常见中间件框架内存马生成工具。一键生成常见中间件框架内存马,让内存马测试变得简单高效,打造内存马的全方位学习平台 下载地址: MemShellParty下载: MemShellParty下载 0x01 功能说明TomcatJettyGlassFishPayaraResinSpringMVCSpringWebFlux…

RK3506到底有多香?抢先看核心板详细参数配置

RK3506是瑞芯微Rockchip在2024年第四季度全新推出的入门级芯片平台,三核Cortex-A7+单核Cortex-M0多核异构设计,具备最高-40~85℃的工业宽温性能、发热量小,IO接口丰富, 即时性高, 低延迟, 反应速度快等特点!触觉智能已推出RK3506核心板,抢先了解核心板详细参数配置。产品概…

机器学习基础原理————可解释性LIME原理

More: https://www.big-yellow-j.top/如果⼀个机器学习模型运⾏良好,为什么我们仅仅信任该模型⽽忽略为什么做出特定的决策呢? 诸如分类准确性之类的单⼀指标⽆法完整地描述⼤多数实际任务。当涉及到预测模型时,需要作出权衡:你是只想知道预测是什么?例如,客户流失的概率…

【神兵利器】Windows平台shellcode免杀加载器

项目介绍 免杀,bypassav,免杀框架,nim,shellcode,使用nim编写的shellcode加载器,可快速生成免杀可执行文件 下载地址 Windows平台shellcode免杀加载器下载:Windows平台shellcode免杀加载器下载 项目特点 1:自带四种加载方式 2:可自行拓展加载方式 3:支持两种加密技术…

在电脑上记录工作内容和日记的软件哪款好用?

想要在电脑上随手记录工作内容、日记琐事、待办事项、日程安排等,哪款软件简单好用呢? 今天来介绍四款常用的电脑桌面记事软件,总有一款是你喜欢的? 一、sticky notes Sticky Notes 是 Windows 系统自带的便签工具,也叫 “便笺”。它以彩色便利贴的形式展现在电脑桌面上,…

JAVA安全之JDK8u141版本绕过研究

基本介绍 从JDK8u141开始JEP290中针对RegistryImpl_Skel#dispatch中bind、unbind、rebind操作增加了checkAccess检查,此项检查只允许来源为本地,下面以bind为例: public void dispatch(Remote var1, RemoteCall var2, int var3, long var4) throws Exception {if (var4 != 4…

漏洞预警 | Apache NiFi信息泄露漏洞

0x00 漏洞编号CVE-2024-565120x01 危险等级中危0x02 漏洞概述 Apache NiFi是一个强大的、易于使用的数据集成平台,旨在自动化和管理数据流,尤其是在大数据环境中。0x03 漏洞详情CVE-2024-56512漏洞类型:信息泄露 影响:获取敏感信息 简述:Apache NiFi的/nifi-api/flow/proc…