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 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...
随机推荐
- 查看Mysql数据库数据量大小、表大小、索引大小
通过MySQL的information_schema数据库,可查询数据库中每个表占用的空间.表记录的行数: 该库中有一个TABLES表,这个表主要字段分别是: TABLE_SCHEMA:数据库名 TA ...
- 【Playwright + Python】系列(九)Playwright 调用 Chrome 插件,小白也能事半功倍
哈喽,大家好,我是六哥!今天我来给大家分享一下如何使用playwight调用chrome插件,面向对象为功能测试及零基础小白,我尽量用大白话的方式举例讲解,力求所有人都能看懂,建议大家先收藏,以免后面 ...
- Abp源码分析之Abp本地化
aspnetcore mvc 实现本地化 新建mvc项目 修改Program.cs using Microsoft.AspNetCore.Localization; using Microsoft.A ...
- vue 子组件data属性为啥必须是一个函数
其实就是一个原因,实例化出来的根组件只有一个,你可以将它写成对象,或者是返回一个对象的函数.但是子组件不够健壮,容易在内存的地址中互相影响,就像我们常用的深浅拷贝所能解决的那样.所以为了防止意外的发生 ...
- Java深度历险(九)——Java安全
安全性是Java应用程序的非功能性需求的重要组成部分,如同其它的非功能性需求一样,安全性很容易被开发人员所忽略.当然,对于Java EE的开发人员来说,安全性的话题可能没那么陌生,用户认证和授权可能是 ...
- golang之常用第三方包汇总
汇总golang日常开发中常用的库包 [web] gin: github.com/gin-gonic/gin [MySQL] gorm: [Redis] go-redis: github.com/ ...
- Golang框架之gin
gin是目前golang的主要web框架之一,之所以选择这个框架是因为其拥有高效的路由性能,并且有人长期维护,目前github上的star数已经破3W. [安装] go get -u github.c ...
- 轻量数据库管理工具之adminer
github: https://github.com/vrana/adminer 官方文档:https://www.adminer.org/#download Supports: MySQL, Mar ...
- API 接口开发调试工具之ApiPost
安装 ApiPost ApiPost 支持 Windows.Mac.Linux 平台,你可以通过这个链接下载软件安装包: https://www.apipost.cn/download.html?fr ...
- Codeforces Round 878 (Div3)
B. Binary Cafe \(1 \leq n,k \leq 10^9\) 题解:思维 考虑两种情况 第一种:钱足够多,每种咖啡都可以买的情况下,答案为\(2^k\) 第二种:钱不够多,因为任一面 ...