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 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,并且所有下标都是未标记状的更多相关文章

  1. 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。

    /** * 给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标. * * 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  2. 对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。 给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。

    // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream& ...

  3. 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9

    python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...

  4. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。

    class Solution {     public int[] twoSum(int[] nums, int target) {         for (int i = 0; i < nu ...

  5. for循环练习题(1 ,判断任意一个数是91的多少倍 2,编写程序实现给定一个整数判断它从0到这个整数中间出现多少次9的次数)

    1 //判断任意一个数是9的多少倍 #include <stdio.h> #include <stdlib.h> int main() { printf("请输入任意 ...

  6. 有一个直方图,用一个整数数组表示,其中每列的宽度为1,求所给直方图包含的最大矩形面积。比如,对于直方图[2,7,9,4],它所包含的最大矩形的面积为14(即[7,9]包涵的7x2的矩形)。给定一个直方图A及它的总宽度n,请返回最大矩形面积。保证直方图宽度小于等于500。保证结果在int范围内。

    // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...

  7. 利用Fiddler修改请求信息通过Web API执行操作(Action)实例

    本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复261或者20170724可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong.me ...

  8. ansible-handlers变更执行操作

    1. ansible-handlers在变更执行操作  1) 编写playbook的handlers的配置文件 1 [root@test-1 bin]# vim /ansible/nginx/bin/ ...

  9. mssql不存在便插入存在不执行操作

    前言 参考:https://www.jb51.cc/mssql/76911.html 在mssql中,在记录不存在时插入记录,如果存在则不执行操作 数据库 相关语句 --创建表 CREATE TABL ...

  10. C# 对包含文件或目录路径信息的 System.String 实例执行操作

    在字符串操作中有一类比较特殊的操作,就是对包含文件或目录路径信息的 System.String 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...

随机推荐

  1. 《机器学习实战》(Machine Learning in Action)

    地址: https://www.manning.com/books/machine-learning-in-action 代码地址: https://www.manning.com/downloads ...

  2. 3.14 深度剖析Linux硬链接和软链接,直击它们的本质!

    建立硬链接和软链接非常简单,那这两种链接有什么区别?它们都有什么作用?这才是链接文件最不容易理解的地方,我们分别来讲讲. ln创建硬链接 我们再来建立一个硬链接文件,然后看看这两个文件的特点. [ro ...

  3. 别再手动处理数据了!FastGPT 这个新功能让你提前下班

    大家好!今天给大家介绍 FastGPT 4.8.11 版本新增的一个超强节点 - [循环运行]节点.如果你经常需要处理大量数据,这个功能绝对能让你事半功功倍! 这个节点是干嘛的? 想象一下这个场景:你 ...

  4. 快速上手 KSQL:轻松与数据库交互的利器

    上次我们通过 Docker 安装了 KingbaseES 数据库,今天我们将开始学习并快速上手使用 KSQL.简单来说,KSQL 本质上是一个客户端工具,用于与数据库进行交互.启动后,我们可以像使用普 ...

  5. 3大策略+1款工具,在K8s上搞定应用零宕机

    原文链接: https://jaadds.medium.com/building-resilient-applications-on-kubernetes-9e9e4edb4d33 翻译:cloudp ...

  6. Nuxt.js 应用中的 webpack:error 事件钩子

    title: Nuxt.js 应用中的 webpack:error 事件钩子 date: 2024/11/25 updated: 2024/11/25 author: cmdragon excerpt ...

  7. Python模块之functools.partial

    在Python编程中,functools.partial是一个强大的工具,它提供了一种部分应用函数的方式,能够在创建新函数时固定部分参数,从而在后续调用中减少需要传递的参数数量.本文将深入介绍func ...

  8. Prometheus之系统安装,启动

    Prometheus简介Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包. 自2012年成立以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人 ...

  9. Elasticsearch之常见问题

    一. 聚合操作时,报Fielddata is disabled on text fields by default GET /megacorp/employee/_search { "agg ...

  10. Codeforces Round 895 (Div. 3)

    B. The Corridor or There and Back Again 题解 考虑二分答案 \(check\)时判断是否\(s_i \leq 2*(k - d_i),k\geq d_i\) c ...