2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其中包含 n 个代表奖励值的数字。 你开始时的总奖励 x 为 0,并且所有下标都是未标记状
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:
题目来自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 main
import (
"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; // 更新 f1
f0 |= 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; // 更新 f1
f0 |= 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 math
def max_total_reward(reward_values):
reward_values.sort()
f0, f1 = 1, 0
for x in reward_values:
mask, one = 0, 1
mask = (one << x) - 1
f1 = (f0 & mask) << x
f0 |= f1
return f0.bit_length() - 1
if __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;
}
}

2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其中包含 n 个代表奖励值的数字。 你开始时的总奖励 x 为 0,并且所有下标都是未标记状的更多相关文章
- 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
/** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...
- 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...
- 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9
python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...
- 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
class Solution { public int[] twoSum(int[] nums, int target) { for (int i = 0; i < nu ...
- for循环练习题(1 ,判断任意一个数是91的多少倍 2,编写程序实现给定一个整数判断它从0到这个整数中间出现多少次9的次数)
1 //判断任意一个数是9的多少倍 #include <stdio.h> #include <stdlib.h> int main() { printf("请输入任意 ...
- 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。
// ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...
- 利用Fiddler修改请求信息通过Web API执行操作(Action)实例
本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...
- ansible-handlers变更执行操作
1. ansible-handlers在变更执行操作 1) 编写playbook的handlers的配置文件 1 [root@test-1 bin]# vim /ansible/nginx/bin/ ...
- mssql不存在便插入存在不执行操作
前言 参考:https://www.jb51.cc/mssql/76911.html 在mssql中,在记录不存在时插入记录,如果存在则不执行操作 数据库 相关语句 --创建表 CREATE TABL ...
- C# 对包含文件或目录路径信息的 System.String 实例执行操作
在字符串操作中有一类比较特殊的操作,就是对包含文件或目录路径信息的 System.String 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...
随机推荐
- Clickhouse入门及实践
ClickHouse安装 采用doker安装测试: 拉取服务端 docker pull yandex/clickhouse-server 拉取客户端 docker pull yandex/clickh ...
- Python文件读取和写入方法
读取 # 通过单字符串空格分隔 def count_words(filepath): with open(filepath, 'r') as file: string = file.read() st ...
- 大厂SSP的Java学习路线
现在互联网环境这么差,Java还能学吗? 学Java还能找到工作吗? 大家好呀, 我是程序员回家养猪, 一个专升本, 三段实习经历拿下大厂SSP offer的程序员博主. 关于我的个人经历, 之前文章 ...
- AI运动小程序开发常见问题集锦二
截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身.体育.体测.AR互动等场景:为了让正在集成或者计划进行功能扩展优化的用户,少走弯路.投入更少的开发资源,针对近期的 ...
- [python] asyncio库常见问题与实践案例
本文详细介绍了在使用asyncio库编写异步程序时常见的错误和问题,并进一步通过实践案例进行分析和讨论,以便在项目中更有效地应用asyncio库.有关asyncio库的详细介绍,可参考:Python ...
- echarts中label上下两行展示
如上图展示 series: [ //系列列表 { name: '设备状态', //系列名称 type: 'pie', //类型 pie表示饼图 radius: ['50%', '70%'], //饼图 ...
- 链路追踪之Jaeger
官方地址:https://www.jaegertracing.io/ [安装] 官方提供了两个安装方式, 1. 基于二进制(https://www.jaegertracing.io/download/ ...
- docker 打包镜像过程
1.首先准备需要打成镜像的JAR包 2.编制Dockerfile文件 FROM docker.gf.com.cn/java:openjdk-8u292-arm64 MAINTAINER 8627905 ...
- .NET Core 基于 IHostedService 实现后台定时任务
.NET Core 基于 IHostedService 实现后台定时任务 迷恋自留地 NET Core 2.0 引入了 IHostedService ,基于它可以很方便地执行后台任务,.NET Cor ...
- This request has been blocked; the content must be served over HTTPS.此请求已被阻止;内容必须通过HTTPS提供
近期在做将高德地图替换为天地图时遇到了这个问题,原因是https由于安全协议禁止了http的请求 http://api.tianditu.gov.cn/api?v=4.0&tk=XXXXXXX ...