【力扣周赛】第 363 场周赛(完全平方数和质因数分解)

news2024/11/26 20:30:27

文章目录

  • 竞赛链接
  • Q1:100031. 计算 K 置位下标对应元素的和
    • 竞赛时代码
    • 写法2——手写二进制中1的数量
  • Q2:100040. 让所有学生保持开心的分组方法数(排序后枚举分界)
    • 竞赛时代码
  • Q3:100033. 最大合金数(二分答案)
    • 竞赛时代码
  • Q4:8041. 完全子集的最大元素和
    • 竞赛时代码——质因数分解+哈希表
    • 解法2——定义core(x)为 x 除去完全平方因子后的剩余结果
  • 成绩记录

竞赛链接

https://leetcode.cn/contest/weekly-contest-363/

Q1:100031. 计算 K 置位下标对应元素的和

https://leetcode.cn/problems/sum-of-values-at-indices-with-k-set-bits/
在这里插入图片描述

提示:
1 <= nums.length <= 1000
1 <= nums[i] <= 10^5
0 <= k <= 10

竞赛时代码

class Solution {
    public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
        int ans = 0;
        for (int i = 0; i < nums.size(); ++i) {
            if (Integer.bitCount(i) == k) ans += nums.get(i);
        }
        return ans;
    }
}

写法2——手写二进制中1的数量

class Solution {
    public int sumIndicesWithKSetBits(List<Integer> nums, int k) {
        int ans = 0;
        for (int i = 0; i < nums.size(); ++i) {
            if (cnt(i) == k) ans += nums.get(i);
        }
        return ans;
    }

    public int cnt(int x) {
        int res = 0;
        while (x != 0) {
            res++;
            x &= x - 1;
        }
        return res;
    }
}

Q2:100040. 让所有学生保持开心的分组方法数(排序后枚举分界)

https://leetcode.cn/problems/happy-students/description/
在这里插入图片描述
提示:
1 <= nums.length <= 10^5
0 <= nums[i] < nums.length

竞赛时代码

将学生排序后, 一个学生 x 被选了的时候,比它小的一定必须被选;同理一个学生 y 不被选的时候,比它大的一定不能被选。

枚举每个位置,假设 0~i 被选择,i+1~n-1 不被选择。检查是否合理,合理则 ans ++;

class Solution {
    public int countWays(List<Integer> nums) {
        // 按题意——一定先选择nums值更小的学生,所以——从小到大排序
        Collections.sort(nums);
        int n = nums.size(), ans = 0;
        if (nums.get(0) > 0) ans++;     // 处理特例是否可以全不选
        // 枚举选择到每个位置
        for (int i = 0; i < n; ++i) {  
            // 检查已经选择人数i+1是否严格大于nums[i]
            if (i + 1 > nums.get(i)) { 
                // 检查已经选择人数i+1是否严格小于下一个没被选择的学生nums[i+1]  (注意要判断越界)
                if (i + 1 < n && nums.get(i + 1) <= i + 1) continue;    // 不满足就跳过
                ans++;  // 这个位置合理,答案+1
            }
        }
        return ans;
    }
}

Q3:100033. 最大合金数(二分答案)

https://leetcode.cn/problems/maximum-number-of-alloys/description/

在这里插入图片描述
提示:
1 <= n, k <= 100
0 <= budget <= 10^8
composition.length == k
composition[i].length == n
1 <= composition[i][j] <= 100
stock.length == cost.length == n
0 <= stock[i] <= 10^8
1 <= cost[i] <= 100

竞赛时代码

注意到题目中说明——“所有合金都需要由同一台机器制造。”,且观察到 k 的数据范围较小,所以可以枚举使用每台机器。
对于每台机器,使用二分查找求出它可以制造出的最大的合金数量。

二分查找时判断的依据是花费的前有没有在 budget 的范围内。

class Solution {
    public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) {
        long ans = 0;
        // 按照题意,所有合金都需要由同一台机器制造。枚举每个机器。
        for (int i = 0; i < k; ++i) {
            ans = Math.max(ans, op(n, budget, composition.get(i), stock, cost));
        }
        return (int)ans;
    }
    
    // 计算使用某台机器时的最大制造数量
    public long op(int n, int budget, List<Integer> composition, List<Integer> stock, List<Integer> cost) {
        // 二分答案
        long l = 0, r = (long)Integer.MAX_VALUE;
        while (l < r) {
            long mid = l + r + 1 >> 1;
            if (check(mid, n, budget, composition, stock, cost)) l = mid;
            else r = mid - 1;
        }
        return l;
    }
    
    // 检查是否可以造出 k 个合金
    public boolean check(long k, int n, int budget, List<Integer> composition, List<Integer> stock, List<Integer> cost) {
        long s = 0;     // 记录额外花费
        for (int i = 0; i < n; ++i) {
            long need = k * composition.get(i);
            if (need <= stock.get(i)) continue;
            s += cost.get(i) * (need - stock.get(i));
            if (s > budget) return false;   // 额外花费超了,不能造出k个合金
        }
        return true;
    }
}

Q4:8041. 完全子集的最大元素和

https://leetcode.cn/problems/maximum-element-sum-of-a-complete-subset-of-indices/description/

在这里插入图片描述
提示:
1 <= n == nums.length <= 10^4
1 <= nums[i] <= 10^9

竞赛时代码——质因数分解+哈希表

对每个下标质因数分解,两两相乘之后的结果是完全平方数,那么这两个数字的质因数分解的奇偶性相同。 例如2=21,8=23;相同质因数出现的次数的奇偶性相同,则两者可以匹配。

根据质因数分解的结果将所有数字分组即可。

class Solution {
    public long maximumSum(List<Integer> nums) {
        // 两两之间相乘之后是完全平方数,则质因数分解结果满足各个质因数数量奇偶性相同
        int n = nums.size();
        String[] mask = new String[n];
        long ans = 0;
        // key是mask,value是sum
        Map<String, Long> m = new HashMap<>();     
        for (int i = 1; i <= n; ++i) {
            mask[i - 1] = op(i);                                        // 计算mask
            m.merge(mask[i - 1], (long)nums.get(i - 1), Long::sum);     // 求和
            ans = Math.max(ans, m.get(mask[i - 1]));                    // 更新答案
        }
        return ans;
    }
    
    // 计算下标x的质因数分解掩码mask
    public String op(int x) {
        // 将质因数的数量为奇数的部分记录下来
        String mask = "";
        for (int i = 2; i <= x / i; ++i) {
            if (x % i == 0) {
                int s = 0;
                while (x % i == 0) {
                    s++;
                    x /= i;
                }
                if (s % 2 == 1) mask += String.valueOf(i) + " ";
            }
        }
        if (x > 1) mask += String.valueOf(x) + " ";
        return mask;
    }
}

解法2——定义core(x)为 x 除去完全平方因子后的剩余结果

https://leetcode.cn/problems/maximum-element-sum-of-a-complete-subset-of-indices/solutions/2446037/an-zhao-corei-fen-zu-pythonjavacgo-by-en-i6nu/

计算方式同质因数分解,把 n 的所有出现次数为奇数的质因子相乘,即为 core(n)。

class Solution {
    public long maximumSum(List<Integer> nums) {
        // 两两之间相乘之后是完全平方数,则质因数分解结果满足各个质因数数量奇偶性相同
        int n = nums.size();
        long[] sum = new long[n + 1];
        long ans = 0;
 
        for (int i = 1; i <= n; ++i) {
            int c = op(i);                 // 计算mask
            sum[c] += nums.get(i - 1);     // 求和
            ans = Math.max(ans, sum[c]);   // 更新答案
        }
        return ans;
    }
    
    // 计算下标x的质因数分解掩码mask
    public int op(int x) {
        // 将质因数的数量为奇数的部分记录下来
        int res = 1;
        for (int i = 2; i <= x / i; ++i) {
            if (x % i == 0) {
                int s = 0;
                while (x % i == 0) {
                    s++;
                    x /= i;
                }
                if (s % 2 == 1) res *= i;
            }
        }
        if (x > 1) res *= x;
        return res;
    }
}

成绩记录

在这里插入图片描述
T4 没有那么难!想得慢了!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019973.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

400电话客服中心电话:为您提供全方位的客户服务

在现代商业环境中&#xff0c;提供优质的客户服务是企业成功的关键之一。为了满足客户的需求和解决问题&#xff0c;许多企业选择设立400电话客服中心。400电话是一种特殊的电话号码&#xff0c;可以通过固定电话和移动电话拨打&#xff0c;客户可以通过这个号码与企业进行沟通…

数据库问题记录(粗略版)oracle、mysql等主流数据库通用

1. ORA-00918&#xff1a;未明确定义列 该问题情况大致为&#xff1a;select 所取列名错误、重复等问题。 2. “select * from temp where 10; ”的含义 布尔值为FALSE&#xff0c;只返回表结构&#xff0c;不返回数据。 举一反三&#xff1a; select * from temp where 1&…

12306 抢票小助手: 完整易用的抢票解决方案 | 开源日报 0917

testerSunshine/12306 Stars: 31.4k License: MIT 12306 购票小助手是一个使用 Python 编写的项目&#xff0c;主要功能包括自动打码、自动登录、准点预售和捡漏、智能候补以及邮件通知等。该项目具有以下核心优势&#xff1a; 支持多个版本的 Python提供验证码本地识别功能可…

JVM执行流程

一、Java为什么是一种跨平台的语言&#xff1f; 通常&#xff0c;我们编写的java源代码会被JDK的编译器编译成字节码文件&#xff0c;再由JVM将字节码文件翻译成计算机读的懂得机器码进行执行&#xff1b;因为不同平台使用的JVM不一样&#xff0c;所以不同的JVM会把相同的字节码…

TypeScript逆变 :条件、推断和泛型的应用

TypeScript逆变 &#xff1a;条件、推断和泛型的应用 1 一个类型问题 有一个名为 test 的函数&#xff0c;它接受两个参数。第一个参数是函数 fn&#xff0c;第二个参数 options 受到 fn 参数的限制。乍一看&#xff0c;这个问题貌似并不复杂&#xff0c;不是吗&#xff1f;糊…

华为OD机试 - 流水线 - 逻辑分析(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

企业部署了MES管理系统为什么还要APS

在制造企业中&#xff0c;MES制造执行系统和高级计划与排程系统&#xff08;APS&#xff09;是两大核心的制造运营管理软件。尽管MES管理系统在工厂层面对生产活动进行实时监控和优化&#xff0c;但APS在更高的战略层面对生产和供应链进行规划和管理。因此&#xff0c;即使企业…

软件系统的验收方法

软件系统的验收是确保软件按照规格要求并满足用户需求的过程。验收过程通常涉及与项目利益相关者&#xff08;包括客户、用户和项目团队&#xff09;一起进行各种测试和评估。以下是一些常见的软件系统验收方法&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#…

操作系统备考学习 day4 (2.1.7 - 2.2.4)

操作系统备考学习 day4 二、进程与线程2.1 进程与线程2.1.7 线程的状态与转换 2.2 处理机调度2.2.1 调度的概念、层次2.2.2 进程调度的时机切换与过程调度的方式2.2.3 调度器、闲逛进程2.2.4 调度算法的评价指标 二、进程与线程 2.1 进程与线程 2.1.7 线程的状态与转换 线程…

STM32 CAN使用记录:FDCAN基础通讯

文章目录 目的基础说明关键配置与代码轮询方式中断方式收发测试 示例链接总结 目的 CAN是非常常用的一种数据总线&#xff0c;被广泛用在各种车辆系统中。这篇文章将对STM32中FDCAN的使用做个示例。 CAN的一些基础介绍与使用可以参考下面文章&#xff1a; 《CAN基础概念》htt…

芯科蓝牙BG27开发笔记9-蓝牙温控器例程阅读

源码&#xff1a; https://download.csdn.net/download/hxkrrzq/88353283 以上源码都是官方资源&#xff0c;可以自行gitbub下载&#xff08;参见之前笔记&#xff09; 蓝牙广播格式化 之前的笔记中广播数据是直接使用的十六进制字符串&#xff0c;关于这32bytes数据的格式化…

算法通关村-----链表中环的问题

环形链表 问题描述 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来表示链表尾连接到链表中…

MySQL 索引分类

文章目录 MySQL 索引分类1、按存储方式区分&#xff08;1&#xff09;BTree 索引1、BTree2、BTree3、BTree 个 BTree 的主要区别4、MySQL为什么选择BTree &#xff08;2&#xff09;哈希索引1、哈希索引的特点 2、使用逻辑区分&#xff08;1&#xff09;普通索引&#xff08;2&…

【SpringMVC】文件上传与下载、JREBEL使用

目录 一、引言 二、文件的上传 1、单文件上传 1.1、数据表准备 1.2、添加依赖 1.3、配置文件 1.4、编写表单 1.5、编写controller层 2、多文件上传 2.1、编写form表单 2.2、编写controller层 2.3、测试 三、文件下载 四、JREBEL使用 1、下载注册 2、离线设置 一…

ChatGLM HuggingFace大语言模型底座

基础介绍 HuggingFace 是一家专注于自然语言处理(NLP)、人工智能和分布式系统的创业公司,创立于2016年。最早是主营业务是做闲聊机器人,2018年 Bert 发布之后,他们贡献了一个基于 Pytorch 的 Bert 预训练模型,即 pytorch-pretrained-bert,大受欢迎,进而将重心转向维护 …

云HIS医院信息化系统:集团化管理,多租户机制,满足医院业务需求

随着云计算、大数据、物联网等新兴技术的迅猛发展&#xff0c;HIS模式的理念、运行机制更新&#xff0c;衍生出了新的HIS模式——云HIS。云HIS是基于云计算、大数据、互联网等高新技术研发的医疗卫生信息平台&#xff0c;它实现了医院信息化从局域网向互联网转型&#xff0c;并…

Python函数进阶:探索高级函数特性与技巧

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Python中的函数不仅仅是…

关于安卓SVGA浅尝(二)加载数据

关于安卓SVGA浅尝&#xff08;二&#xff09;加载数据 相关链接 SVGA官网 SVGA-github说明文档 背景 项目开发&#xff0c;都会和动画打交道&#xff0c;动画的方案选取&#xff0c;就有很多选择。如Json动画&#xff0c;svga动画&#xff0c;gif等等。各有各的优势。目前项…

PHP8的类与对象的基本操作之成员方法-PHP8知识详解

成员方法是指在类中声明的函数。 在类中可以声明多个函数&#xff0c;所以对象中可以存在多个成员方法。类的成员方法可以通过关键字进行修饰&#xff0c;从而控制成员方法的商用权限。 函数和成员方法唯一的区别就是&#xff0c;函数实现的是某个独立的功能&#xff0c;而成…

Zero-Shot 使用简单两层网络不用训练就能进行图像恢复

文章 今天要分享的文章是CVPR2023比较有意思的一篇《Zero-Shot Noise2Noise: Efficient Image Denoising without any Data》&#xff0c;通过简单的两层网络&#xff0c;并且不需要数据训练直接进行图像恢复 代码 https://colab.research.google.com/drive/1i82nyizTdszyHk…