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 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...
随机推荐
- 基于Java+SpringBoot心理测评心理测试系统功能实现五
一.前言介绍: 1.1 项目摘要 心理测评和心理测试系统在当代社会中扮演着越来越重要的角色.随着心理健康问题日益受到重视,心理测评和心理测试系统作为评估个体心理状态.诊断心理问题.制定心理治疗方案的工 ...
- AI运动小程序开发常见问题集锦一
截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身.体育.体测.AR互动等场景:为了让正在集成或者计划进行功能扩展优化的用户,少走弯路.投入更少的开发资源,我们归集了 ...
- 【一步步开发AI运动小程序】五、帧图像人体识别
随着人工智能技术的不断发展,阿里体育等IT大厂,推出的"乐动力"."天天跳绳"AI运动APP,让云上运动会.线上运动会.健身打卡.AI体育指导等概念空前火热.那 ...
- Dockerfile&Docker-Compose之基础
使用了很久的docker,之前却从来没有总结过, 于是开此篇来记录平常使用Dockerfile和docker-compose.yaml的点滴, 先从基础命令开始哦 [Dockerfile] Docke ...
- python之常用方法(精)
查找列表中出现最频繁的元素 使用 max() 函数可以快速查找出一个列表中出现频率最高的某个元素. >>> a = [1, 2, 3, 4, 3, 4, 5, 4, 4, 2] &g ...
- Redis为什么这么快之IO多路复用
情景复现 面试官:Redis为什么这么快? 我:1. 基于内存 2. 高效数据结构 3. 单线程 4. IO多路复用 面试官:那你讲讲Redis的IO多路复用模型是什么. 我:哦,嗯,啊,呀...IO ...
- Playfair密码
Playfair密码 Playfair cipher (普莱费尔密码)一种古典对称式密码,是首个双字母替换的加密法.尽管以现在的眼光来看这种加密是非常不安全的,但是它加密的过程还是蛮有意思的. 这种加 ...
- Qt QTtoolButton 鼠标移动到按钮上时,弹出菜单后,按钮的hover状态无法恢复的问题
需求:QTtoolButton 鼠标移到按钮上时,弹窗菜单,并且点击菜单或者其他地方,菜单关闭后,按钮的hover状态需要恢复原状. 1. 创建按钮和菜单,并安装事件过滤器 m_Menu = new ...
- 12C++循环结构-for循环(2)——教学
一.循环变量为字符型 (第32课 26个兄弟姐妹)参考视频1 试编一程序,按字典顺序输出26个字母. 流程图: 思考:先顺序输出26个小写英文字母,再逆序输出26个大写英文字母. 循环可以是递增型循环 ...
- 加速人民币国际化,CIPS迎来三大变化
何谓CIPS? 人民币跨境支付系统(Cross-border Interbank Payment System,简称CIPS)是由中国人民银行组织开发的独立支付系统,为境内外金融机构人民币跨境和离岸业 ...