2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其中包含 n 个代表奖励值的数字。 你开始时的总奖励 x 为 0,并且所有下标都是未标记状

news/2025/1/15 10:03:20/文章来源:https://www.cnblogs.com/moonfdd/p/18672362

2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其中包含 n 个代表奖励值的数字。
你开始时的总奖励 x 为 0,并且所有下标都是未标记状态。你可以进行以下操作若干次:

1.从索引范围 [0, n - 1] 中选择一个未标记的下标 i。

2.如果 rewardValues[i] 大于当前总奖励 x,则将 rewardValues[i] 加到 x 上(即 x = x + rewardValues[i]),并将下标 i 标记为已处理。

请计算并返回通过最佳策略能够获得的最大总奖励。

1 <= rewardValues.length <= 2000。

1 <= rewardValues[i] <= 2000。

输入:rewardValues = [1,1,3,3]。

输出:4。

解释:

依次标记下标 0 和 2,总奖励为 4,这是可获得的最大值。

答案2025-01-15:

chatgpt

题目来自leetcode3180。

大体步骤如下:

1.将给定的奖励数组 rewardValues 排序,假设输入为 [1, 1, 3, 3],排序后会变成 [1, 1, 3, 3]。

2.初始化两个大整数 f0 和 f1,f0 初始化为 1,f1 初始化为 0。

3.开始遍历排序后的奖励数组 rewardValues。

4.对于每个奖励值 x,创建两个大整数 mask 和 one。mask 用来表示当前处理的奖励的标记位,初始为0;one 表示1。

5.计算当前奖励 x 对应的mask值:mask = (1 << x) - 1。

6.计算 f1 = (f0 & mask) << x。

7.更新 f0 = f0 | f1。

8.返回 f0 中最高位1的位置减1(即 f0.BitLen() - 1)作为最大总奖励值。

总的时间复杂度分析:

  • 排序数组的时间复杂度为O(nlogn),其中 n 为奖励数组的长度。

  • 遍历奖励数组的时间复杂度为 O(n)。

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

总的额外空间复杂度分析:

  • 额外创建了一些大整数值,但这些值的个数不随输入数组大小变化,辅助空间复杂度可以忽略不计。
    所以总的额外空间复杂度为 O(1)。

Go完整代码如下:

package mainimport ("fmt""sort""math/big"
)func maxTotalReward(rewardValues []int) int {sort.Ints(rewardValues)f0, f1 := big.NewInt(1), big.NewInt(0)for _, x := range rewardValues {mask, one := big.NewInt(0), big.NewInt(1)mask.Sub(mask.Lsh(one, uint(x)), one)f1.Lsh(f1.And(f0, mask), uint(x))f0.Or(f0, f1)}return f0.BitLen() - 1
}func main() {rewardValues := []int{1,1,3,3}result := maxTotalReward(rewardValues)fmt.Println(result)
}

在这里插入图片描述

C完整代码如下:

#include <stdio.h>
#include <stdlib.h>// 函数用来比较两个整数,供 qsort 使用
int compare(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}// 计算最大总奖励的函数
int maxTotalReward(int *rewardValues, int size) {// 排序奖赏值数组qsort(rewardValues, size, sizeof(int), compare);unsigned long long f0 = 1; // 初始值unsigned long long f1 = 0; // 变量 f1// 遍历奖赏值数组for (int i = 0; i < size; ++i) {int x = rewardValues[i];unsigned long long mask = (1ULL << x) - 1; // 生成掩码f1 = (f0 & mask) << x; // 更新 f1f0 |= f1; // 更新 f0}// 计算 f0 的位长度并返回int maxReward = 0;while (f0 >= (1ULL << maxReward)) {maxReward++;}return maxReward - 1; // 返回最大奖励
}int main() {int rewardValues[] = { 1, 1, 3, 3 };int size = sizeof(rewardValues) / sizeof(rewardValues[0]);int result = maxTotalReward(rewardValues, size);printf("%d\n", result); // 输出结果return 0;
}

在这里插入图片描述

C++完整代码如下:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>int maxTotalReward(std::vector<int>& rewardValues) {// 排序奖赏值数组std::sort(rewardValues.begin(), rewardValues.end());unsigned long long f0 = 1; // 初始值unsigned long long f1 = 0; // 变量 f1// 遍历奖赏值数组for (int x : rewardValues) {unsigned long long mask = (1ULL << x) - 1; // 生成掩码f1 = (f0 & mask) << x; // 更新 f1f0 |= f1; // 更新 f0}// 计算 f0 的位长度并返回return static_cast<int>(std::log2(f0)); // 使用 log2 计算位长度
}int main() {std::vector<int> rewardValues = {1, 1, 3, 3};int result = maxTotalReward(rewardValues);std::cout << result << std::endl; // 输出结果return 0;
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-import mathdef max_total_reward(reward_values):reward_values.sort()f0, f1 = 1, 0for x in reward_values:mask, one = 0, 1mask = (one << x) - 1f1 = (f0 & mask) << xf0 |= f1return f0.bit_length() - 1if __name__ == "__main__":reward_values = [1, 1, 3, 3]result = max_total_reward(reward_values)print(result)

在这里插入图片描述

JavaScript完整代码如下:

function maxTotalReward(rewardValues) {rewardValues.sort((a, b) => a - b);let f0 = BigInt(1);let f1 = BigInt(0);for (let x of rewardValues) {let mask = BigInt(1) << BigInt(x);mask -= BigInt(1);f1 = (f0 & mask) << BigInt(x);f0 |= f1;}return f0.toString(2).length - 1;
}const rewardValues = [1, 1, 3, 3];
const result = maxTotalReward(rewardValues);
console.log(result);

在这里插入图片描述

Solidity完整代码如下:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract MaxTotalReward {function maxTotalReward(uint[] memory rewardValues) public pure returns (uint) {uint n = rewardValues.length;uint[2] memory f;f[0] = 1;f[1] = 0;for (uint i = 0; i < n; i++) {uint x = rewardValues[i];uint mask = (1 << x) - 1;f[1] = (f[0] & mask) << x;f[0] |= f[1];}return 256 - 1 - clz(f[0]);}function clz(uint x) pure private returns (uint) {uint res = 0;while ((x & (1 << 255)) == 0) {x <<= 1;res++;}return res;}
}

在这里插入图片描述

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

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

相关文章

Python包管理uv使用

介绍 用Rust编写的一个极其快速的Python包和项目管理器。 比pip快10-100倍。 安装和管理 Python 版本。 运行和安装 Python 应用程序。 通过 curl 或 pip ,无需 Rust 或 Python 即可安装。 支持 macOS、Linux 和 Windows。安装 使用独立安装# macOS / Linux curl -LsSf https:…

Calculator VB6

Calculator是我用VB6开发的计算器,支持语音朗读。 在计算方面,支持加减乘除四则运算。也支持括号此外,与VBS语法一样,还可以使用三角函数、平方等运算符。

SendMail C#版

SendMail是我用C#开发的一款发送邮件的工具。 左侧是要发送的内容,右侧是发件人的账户配置,具体可以参考新浪邮箱或者Outlook账户配置方面的资料。输入各项,点击【发送】按钮,对方就收到了邮件。

Windows 行为测试 删除 FileStream 正在读写文件可以继续读写

本文在 Win11 系统下,测试使用 FileStream 对文件进行读写,读写过程中,删除正在读写的文件后的行为测试结论: 使用 FileShare 带 Delete 的共享方式打开的 FileStream 正在对文件进行读写过程中,可以对正在读写的文件进行删除。文件删除之后,不影响已经打开的 FileStream…

如何轻松实现服务器文件自动化传输,保障传输安全与效率?

服务器文件自动化传输是企业数据管理中至关重要的一环,确保数据的一致性、完整性和可用性。常见的服务器文件自动化传输方式,像FTP/HTTP等传统协议的⽂件同步⼯具来实现。但存在一定问题: 1.传输安全可靠性低:传输过程受⽹络环境影响较⼤,易出现延迟、断线、⽂件丢包等情况…

芯片半导体基础(二) :20世纪最伟大的发明,PN结与晶体二极管

liwen01 2025.01.12 前言 PN结 是晶体管的基础,它使得晶体管能够作为一个放大或是开关元器件。晶体管的发明不仅是一个技术上的突破,也标志着电子学的一个新时代。它极大地推动了科技和社会的发展,奠定了现代信息技术的基础,因此也被认为是20世纪最伟大的发明之一。 1947年…

DevExpress gridControl 绑定数据源之后添加非绑定列

using (DevExpress.Utils.WaitDialogForm dlg = new DevExpress.Utils.WaitDialogForm("请稍等", "查询中......", new System.Drawing.Size(100, 50))){string sqlString = "SELECT ITEM ,DESCRIPTION ,CATEGORY3 FROM WIPDBA.TIME_IMA x WHERE x.…

Gitlab搭建npm仓库

由于图片和格式解析问题,为了更好阅读体验可前往 阅读原文:::warning 使用gitlab的仓库注册表特性需要版本14.0+,如果你的版本比较低,请先根据自己的需求合理升级后再使用 ::: npm私有仓库的搭建方式有很多种,比如使用docker(阅读此篇),这里讲述如何使用gitlab作为npm仓库…

k8s~控制deamonset中pod的数量

DaemonSet 是 Kubernetes 中的一种控制器,用于确保集群中的每个节点(或特定标签选择器匹配的节点)运行一个 Pod 的副本。DaemonSet 通常用于运行集群守护进程,如日志收集、监控代理、存储卷插件等。以下是如何控制 DaemonSet 中 Pod 数量的方法:使用节点选择器(Node Sele…

读量子霸权04量子计算机的黎明

量子计算机的黎明1. 晶体管的诞生 1.1. 1956年,三位物理学家因发明了这种神奇的装置而获得诺贝尔奖:贝尔实验室的科学家约翰巴丁、沃尔特布拉顿和威廉肖克利1.1.1. 巴丁、布拉顿和肖克利使用了一种新的量子形式的物质,即半导体1.1.2. 金属是允许电子自由流动的导体1.1.3. 玻…

Arch Linux默认中文输入法设置输入关键字直接给出日期和时间

自定义词组就行,关键字如下#$year年$month月$day日 星期$weekday $fullhour:$minute:$second如下图, 设置里-输入法,进入输入法菜单界面,选择你的输入法设置进入到你的中文输入法设置界面后,拉到中间的位置,有一个【管理自定义词组】,点进去 添加一个词组,把上面的词组…