首页 > 其他分享 >2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其中包含 n 个代表奖励值的数字。 你开始时的总奖励 x 为 0,并且所有下标都是未标记状

2025-01-15:执行操作可获得的最大总奖励 Ⅰ。用go语言,给定一个整数数组 rewardValues,其中包含 n 个代表奖励值的数字。 你开始时的总奖励 x 为 0,并且所有下标都是未标记状

时间:2025-01-15 10:12:14浏览次数:1  
标签:f0 f1 01 int mask 奖励 rewardValues go

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;
    }
}

在这里插入图片描述

标签:f0,f1,01,int,mask,奖励,rewardValues,go
From: https://www.cnblogs.com/moonfdd/p/18672362

相关文章

  • 【轻松掌握数据结构与算法】字符串算法(String Algorithms)
    字符串算法概述字符串匹配算法是计算机科学中的一个重要领域,主要用于在文本中查找特定模式(子字符串)的出现位置。这些算法在文本编辑器、搜索引擎、生物信息学等领域有广泛的应用。暴力法(BruteForceMethod)暴力法是最直接的字符串匹配算法,它通过逐个字符比较来查找模式在文......
  • Python+Django的框架药品购买系统(Pycharm Flask Django Vue mysql)
    收藏关注不迷路,防止下次找不到!文章末尾有惊喜项目介绍Python+Django的框架药品购买系统(PycharmFlaskDjangoVuemysql)项目展示详细视频演示请联系我获取更详细的演示视频,相识就是缘分,欢迎合作!!!所用技术栈前端vue.js框架支持:django数据库:mysql......
  • Python+Django的智能宾馆预定系统(Pycharm Flask Django Vue mysql)
    收藏关注不迷路,防止下次找不到!文章末尾有惊喜项目介绍Python+Django的智能宾馆预定系统(PycharmFlaskDjangoVuemysql)项目展示详细视频演示请联系我获取更详细的演示视频,相识就是缘分,欢迎合作!!!所用技术栈前端vue.js框架支持:django数据库:mysql5.7数......
  • P4770 [NOI2018] 你的名字 题解
    \(\text{P4770[NOI2018]你的名字题解}\)注意到\(l=1,r=|S|\)有整整68分的高分,让我们先来考虑这样的特殊情况。这样的特殊情形实际上要我们求的是\(t\)有多少个本质不同的子串满足其不是\(s\)的子串。正着做看上去有些困难,于是维护\(s,t\)的本质不同公共子串个数,用......
  • Datawhale 组队学习wow-agenttask01 openai库搭建Al Agent
    Datawhale组队学习wow-agentDatawhale项目链接:https://www.datawhale.cn/learn/summary/86笔记作者:博客园-岁月月宝贝......
  • 【Go】万字长文解析:使用Go语言的WebSocket实现一个群聊聊天室项目
    本文目录一、背景介绍二、后端代码1、data.go2、server.go3、hub.go4、connection.go为什么c可以直接给h的通道发送数据?为什么reader不需要go协程开启?5、后端流程6、一些难点部分怎么理解hub?一个新用户上线的过程?三、前端代码一、背景介绍本文是近期为了参加......
  • 逐笔成交逐笔委托Level2高频数据下载和分析:20250113
    level2逐笔成交逐笔委托下载链接:https://pan.baidu.com/s/1MznaXomAMSfljBMwAF9CDA?pwd=2rkf提取码:2rkfLevel2逐笔成交逐笔委托数据分享下载 采用Level2逐笔成交与逐笔委托的详细记录,这种毫秒级别的数据能揭露众多关键信息,如庄家意图、虚假交易,使所有交易行为透明......
  • Level2逐笔成交逐笔委托毫秒记录:今日分享优质股票数据20250113
    level2逐笔成交逐笔委托下载链接:https://pan.baidu.com/s/1MznaXomAMSfljBMwAF9CDA?pwd=2rkf提取码:2rkfLevel2逐笔成交逐笔委托数据分享下载 采用Level2逐笔成交与逐笔委托的详细记录,这种毫秒级别的数据能揭露众多关键信息,如庄家意图、虚假交易,使所有交易行为透明......
  • docker-compose自动部署go项目全流程,本地到镜像仓库到服务器,踩坑笔记
    声明:个人所学记录,有可以改进的地方希望不吝指教Dockerfile#使用golang官方镜像作为构建环境FROMgolang:1.23-alpineASbuilder#设置工作目录WORKDIR/app#设置环境变量镜像变量ENVGO111MODULE=onENVGOPROXY=https://goproxy.cn,direct#复制go.mod和go.sum文......
  • 【Gossip 协议】Redis 集群中节点之间的通信方式?
    #分布式系统#Gossip协议在分布式系统中,不同的节点进行数据/信息共享是一个基本的需求。一种比较简单粗暴的方法就是集中式发散消息,简单来说就是一个主节点同时共享最新信息给其他所有节点,比较适合中心化系统。这种方法的缺陷也很明显,节点多的时候不光同步消息的效率低,还太......