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 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...
随机推荐
- 2个月搞定计算机二级C语言——真题(10)解析
1. 前言 本篇我们讲解2个月搞定计算机二级C语言--真题10 2. 程序填空题 2.1 题目要求 2.2 提供的代码 #include <stdio.h> #pragma warning ...
- 3-4 C++迭代器初步
目录 3.4.0 为什么要有迭代器 3.4.1使用迭代器 迭代器的比较操作 用迭代器写一个遍历 取出迭代器中的元素:解引用 * 迭代器的类型 使用迭代器时的注意点 3.4.2 迭代器的算术操作 常见操 ...
- 摒弃传统setInterval, 自己封装一个
传统的setInterval在某种情况下会导致内存泄漏,每次调用都会占用一部分内存空间,既然threejs的更新都是基于# requestAnimationFrame的循环调用,那么我们就可以利用这个 ...
- Cisco Packet Tracer 交换机代码
二层交换机S1代码: >en #conf t #vlan 10 #vlan 20 #int r f 0/1-5 #sw a v 10 #int r f 0/6-10 #sw a v 20 #i ...
- OSG开发笔记(三十三):同时观察物体不同角度的多视图从相机技术
前言 前面的相机hud可以单独显示图形,继续深入研究相机hud,技术就是子视图了,实现该功能的直接技术是从相机技术. 本篇描述osg从相机技术 Demo 相机视口的关键调用 ...
- ArrayList源码分析(基于JDK1.6)
不积跬步,无以至千里:不积小流,无以成江海.从基础做起,一点点积累,加油! <Java集合类>中讲述了ArrayList的基础使用,本文将深入剖析ArrayList的内部结构及实现原理,以 ...
- 【3分钟学会】一招禁用表单中input输入框回车键自动触发提交事件!
知其然知其所以然 在前端项目开发中,偶尔会有表单提交的问题: 用户输入表单后,不小心按了回车键,导致提前触发了提交事件? 问题概述 当表单中仅有一个input输入框时,按下回车键就会自动触发提交事件, ...
- Linx操作Nginx命令
在 CentOS 上操作 Nginx 包括安装.启动.停止.重新加载配置等.以下是在 CentOS 上操作 Nginx 的常用命令: 安装 Nginx: sudo yum install nginx ...
- uni-app下载文件在ios下失败
标签: js uni-app 前情 uni-app是我很喜欢的跨平台框架,它能开发小程序,H5,APP(安卓/iOS),对前端开发很友好,自带的IDE让开发体验也很棒,公司项目就是主推uni-app. ...
- VLC web(http)控制 (1) 设置与登录
VLC3.0 web控制设置步骤: 1.打开偏好设置并显示全部: 2.进入主界面选项,选中Web: 3.进入Lua中设置HTTP密码: 重启软件生效. 这时就可以通过http://127. ...