LeetCode---117双周赛---容斥原理

题目列表

2928. 给小朋友们分糖果 I

2929. 给小朋友们分糖果 II

2930. 重新排列后包含指定子字符串的字符串数目

2931. 购买物品的最大开销

一、给小朋友们分糖果I

看一眼数据范围,如果没有啥其他想法思路就直接暴力,时间复杂度O(n^2)

思路:枚举前两个小朋友分得的合法糖果数,看第三个小朋友的糖果数是否符合条件

代码如下

class Solution {
public:
    int distributeCandies(int n, int limit) {
        int ans=0;
        for(int i=0;i<=min(n,limit);i++){
            for(int j=0;j<=min(n-i,limit);j++){
                ans+=(n-i-j<=limit);
            }
        }
        return ans;
    }
};

二、给小朋友们分糖果II

 

和上一题一样的题目,数据范围变大,不能暴力,需要优化时间复杂度,如何优化???

上一题思路是枚举两个元素,来看第三个元素是否符合条件,但其实我们只要枚举一个元素,就能知道剩余的糖果如何分配,才能合法,因为剩余两个元素的和是固定的

举个例子:如果剩余的糖果数为10,limit=3,分配的方式为:3和7,4和6,5和5,6和4,7和3,一共7-3+1=5种,即我们只要能算出第二个元素或第三个元素的取值范围,就能得到合法的方案数

设left为剩余糖果的数量,总共有三种情况

1.left<=limit,即剩下的糖果随便怎么分都行,共有left+1种方案,注意0和left也是一种方案

2.left>limit*2,即剩下的糖果无论怎么分,都会有一个人的糖果数>limit,方案数为0

3.limit<left<=limit*2,即有合法的分配方案,但不能随意分配,有限制,其中一个人的糖果数范围是[left-limit,limit],共有limit-(left-limit)+1种方案数

代码如下 

class Solution {
public:
    int distributeCandies(int n, int limit) {
        int ans=0;
        for(int i=0;i<=min(n,limit);i++){
            int left=n-i;
            if(left<=limit)
                ans+=left+1;
            else if(limit*2>=left){
                int x=left-limit;
                ans+=limit-x+1;
            }
        }
        return ans;
    }
};

这题还有一个O(1)时间复杂度的算法,利用容斥原理来做,不了解的可以去了解一下

这题可以转换为将n个球放入3个不同的盒子中,盒子可以为空,且每个盒子最多装limit个球,问共有多少方案?非常经典的数学题,解题思路是合法方案数 = 总的方案数 - 不合法的方案数,其中总的方案数很容易求,不合法的方案数可以用容斥原理求,两个的时间复杂度都为O(1)

1.总的方案数的求解

"隔板法" :将n个球放成一排,在他们中间插入两个隔板,将球分为三组,有多少种排列方式,注意两个隔板可以放在一起,因为题目允许盒子为空,根据排列组合,共有C(n+2,2)种方法

可能有人对这个公式的由来不理解,其实我们也可以用乘法原理来求解,我们先将一个隔板插入,有n+1个位置可以选,再将第二个隔板插入,这时第一个隔板也被看做是球,则有n+2个位置可以选,而两个隔板的放置可能出现第一个隔板的位置和上一次第二个隔板的位置相同,第二个隔板的位置和上一次第一个隔板的位置相同的情况,所以总方案数要除以2,为(n+1)*(n+2)/2=C(n+2,2)

2.不合法的方案数---容斥原理

集合A---A盒中球的数量超出limit的方案数

集合B---B盒中球的数量超出limit的方案数

集合C---C盒中球的数量超过limit的方案数

根据容斥原理:不合法的方案数=A+B+C-A∩B-A∩B-A∩B+A∩B∩C

而A=B=C,A∩B=A∩C=B∩C

所以我们只要求三个数就行

A:提前在A盒中放入limit+1个球,让剩下的球随便放,方案数为C(n-limit-1+2,2)

A∩B:提前在A盒、B盒中放入limit+1个球,让剩下的球随便放,方案数为C(n-2*(limit-1)+2,2)

A∩B∩C:提前在A盒、B盒、C盒中放入limit+1个球,让剩下的球随便放,方案数为C(n-3*(limit-1)+2,2)

注意:上面三个的前提是还有剩余的球,如果剩余的球<=0,则方案数为0

代码如下 

class Solution {
    typedef long long LL;
public:
    LL C2(LL n)//计算C(n,2)
    {
        if(n>1)
            return n*(n-1)/2;
        else
            return 0;
    }
    long long distributeCandies(int n, int limit) {
        return C2(n+2)-3*C2(n-(limit+1)+2)+3*C2(n-2*(limit+1)+2)-C2(n-3*(limit+1)+2);
    }
};

三、重新排序后包含指定子字符串的字符串的数目 

这题也能用容斥原理来做:(题目中是小写,下面用大写代替)

A集合:L没有出现的方案数                                                                                25^n

B集合:E没有出现或只出现一次的方案数                                                          25^n+n*25^(n-1)

C集合:T没有出现的方案数                                                                                25^n

A∩B:L没有出现 并且 E没有出现或只出现一次的方案数                                   24^n+n*24^(n-1)

A∩C:L没有出现 并且 T没有出现的方案数                                                         24^n

B∩C:T没有出现 并且 E没有出现或只出现一次的方案数                                   24^n+n*24^(n-1)

A∩B∩C:L没有出现 并且 T没有出现 并且 E没有出现或只出现一次的方案数    23^n+n*23^(n-1)

不合法方案数(容斥原理):A+B+C-A∩B-A∩B-A∩B+A∩B∩C

总的方案数:26^n

计算幂,要用到快速幂的算法,时间复杂度为O(logn) 

代码如下

class Solution {
    typedef long long LL;
    const int MOD=1e9+7;
public:
    //快速幂
    LL POW(LL a,LL b)//a^b
    {
        int res=1;
        while(b){
            if(b&1) res=(res*a)%MOD;
            a=(a*a)%MOD;
            b>>=1;
        }
        return res;
    }
    int stringCount(int n) {
        //公式可以化简如下
        LL ans=POW(26,n)-((75+n)*POW(25,n-1)-(72+2*n)*POW(24,n-1)+(23+n)*POW(23,n-1));
        return (ans%MOD+MOD)%MOD;
    }
};

当然如果你没想到或者没学过容斥原理,这题还能用分组背包来求解,问题转化为:每次在'a'-'z'中选择一个字母,要求最后选择了至少1个L,1个T,2个E的方案数,时间复杂度为O(n)

代码如下

class Solution {
    const int MOD=1e9+7;
public:
    int stringCount(int n) {
        long long memo[n+1][2][2][3];
        memset(memo,-1,sizeof(memo));
        function<int(int,int,int,int)>dfs=[&](int i,int L,int T,int E)->int{
            if(i==0)
                return L==0&&T==0&&E==0;
            if(memo[i][L][T][E]!=-1) return memo[i][L][T][E];
            long long res=0;
            res+=dfs(i-1,0,T,E);//选择L
            res+=dfs(i-1,L,0,E);//选择T
            res+=dfs(i-1,L,T,max(E-1,0));//选择E
            res+=(long long)dfs(i-1,L,T,E)*23;//选择其他的字母
            return memo[i][L][T][E]=res%MOD;
        };
        return dfs(n,1,1,2);
    }
};

四、购买物品的最大开销

 

这题反倒是没什么难点, 我们根据题意,就能猜到小天数*小的商品价格得到的乘积之和为最大开销(根据排序不等式可知),接下来,只要证明我们能在某天买到与之对应的小的商品价格,这很容易证明:因为我们每次选择都是在每一行剩余元素的最小值组成的集合中,即我们可以选到剩余所有数中的最小值。

代码如下

class Solution {
public:
    long long maxSpending(vector<vector<int>>& values) {
        int n=values.size(),m=values[0].size();
        vector<int>dp(m*n);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                dp[i*m+j]=values[i][j];
            }
        }
        sort(dp.begin(),dp.end());
        long long ans=0;
        for(int i=0;i<m*n;i++){
            ans=(ans+(long long)(i+1)*dp[i]);
        }
        return ans;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GB28181学习(十六)——基于jrtplib实现tcp被动和主动收流

前言 GB/T28181-2022实时流的传输方式介绍&#xff1a;https://blog.csdn.net/www_dong/article/details/134255185 tcp passive收流 流程图 注意&#xff1a; m字段指定传输方式为TCP/RTP/AVP&#xff1b;sdp信息中增加"asetup:passive"&#xff1b;SIP服务器启…

STM32踩坑:LAN8720未接网线,上电后再接网线,网络模块无法正常使用

LAN8720未接网线&#xff0c;上电后再接网线&#xff0c;网络模块无法正常使用 一、问题描述 最近因为做的项目出了BUG&#xff0c;STM32 单片机在未接网线的状态下&#xff0c;上电一段时间后&#xff0c;将网线插入网口后&#xff0c;IP地址ping不通&#xff0c;网络模块无…

股票魔法师第二阶段趋势模板选股公式,寻找上涨趋势

对于股票运行的阶段&#xff0c;不同的股票分析方法有着不同的划分方式。从传统的主力运作分析&#xff0c;可以分为吸筹、洗盘、试盘、拉升、出货五个阶段。在波浪理论中&#xff0c;一个完整的上升或下降周期包含8浪&#xff08;其中5浪是主浪、3浪是调整浪&#xff09;。在缠…

Unity中Shader纹理的多级渐远Mipmap

文章目录 前言一、什么是Mipmap二、Mipmap能带来什么好处1、增加缓存命中率&#xff0c;减少像素抖动感2、可配合质量设置来分级加载&#xff0c;减少不同配置下的内存 二、我们在Shader中实现一下该效果1、我们先布置一个简单的棋盘格&#xff0c;用于测试纹理的多级效果2、我…

vue3 + ts项目(无vite)报错记录

记录项目创建后遇到的报错 1.类型“Window & typeof globalThis”上不存在属性“_CONFIG”。ts(2339) 问题描述&#xff1a; 使用全局 window 上自定义的属性&#xff0c;TypeScript 会报属性不存在 解决&#xff1a;需要将自定义变量扩展到全局 window 上&#xff0c…

MetaCyc、KEGG傻傻分不清?

今天小编从以下三点给大家唠一唠&#xff1a;MetaCyc数据库介绍、与KEGG比较、使用方法。 一、MetaCyc数据库介绍 MetaCyc全称Metabolic Pathways From all Domains of Life&#xff0c;属于BioCyc子数据库&#xff0c;BioCyc是一个专注于代谢通路的高质量数据库。MetaCyc是一个…

完整版指南:企业网络中的VXLAN-BGP-EVPN

随着互联网的发展&#xff0c;数据中心的数量和规模呈爆炸性增长趋势。数据中心业务不断增加&#xff0c;用户需求不断提高。随之而来的问题是数据中心的功能变得越来越复杂&#xff0c;运维管理变得越来越困难。VXLAN-BGP-EVPN的出现为企业网络带来了无限的可能性。 什么是VX…

跟李沐学AI-深度学习课程00-03【预告、课程安排、深度学习介绍、安装】

目录 00 预告 01 课程安排 02 深度学习介绍 03 安装 本地安装 04 数据操作数据预处理 数据操作 数据类型 创建数组 访问元素 数据操作实现 入门 运算符 广播机制 索引和切片 节省内存 转换为其他Python对象 数据预处理实现 读取数据集 处理缺失值 转换为张…

vue下载xlsx表格

vue下载xlsx表格 // 导入依赖库 import XLSX from xlsx; import FileSaver from file-saver; methods:{btn(){let date new Date()let Y date.getFullYear() -let M (date.getMonth() 1 < 10 ? 0 (date.getMonth() 1) : date.getMonth() 1) -let D (date.getDat…

基于springboot实现私人健身与教练预约管理系统项目【项目源码+论文说明】

基于springboot实现私人健身与教练预约管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应…

几款开源视频编辑软件的比较

软件特点OpenShot跨平台、免费开源、易于上手、功能丰富Shotcut跨平台、免费开源、支持多种格式、性能强大kdenlive跨平台、开源、功能强大、支持多种滤镜Avidemux跨平台、免费开源、小巧简洁、功能实用 OpenShot 是一款免费开源的视频编辑软件&#xff0c;支持 Windows、macO…

Axure RP 9下载教程,轻松入手!

Axurerp9是产品经理必备的专业快速原型设计工具。Axurerp9可以快速高效地创建产品原型图&#xff0c;绘制APP和网页的原型图、框架图、结构图等。但Axurerp9下载在用户体验上的缺陷也很明显&#xff0c;其设置交互方式相对繁琐&#xff0c;可视化不足、条件判断、变量、中继器等…

操作系统 day11(进程调度时机、切换、调度方式)

进程调度的时机 这里的主动放弃指的是—内中断&#xff08;异常、例外&#xff09;&#xff0c;中断信号来自CPU内部。而被动放弃指的是—外中断&#xff08;中断&#xff09;&#xff0c;中断信号来自CPU外部 如果该进程还没退出临界区&#xff08;还没解锁&#xff09;就进行…

【2023高交会成绩单出炉】Gooxi斩获“AIC年度标杆应用奖”大奖

第25届中国国际高新技术成果交易会&#xff08;简称“高交会”&#xff09;在深圳盛大开幕&#xff0c;作为高交会人工智能板块的重点活动之一&#xff0c;11.16日的第八届人工智能领袖大会的AIC年度奖项评选环节备受关注&#xff0c;Gooxi从多家入围企业中脱颖而出&#xff0c…

Linux输入设备应用编程(键盘,按键)

目录 一 输入设备编程介绍 1.1 什么是输入设备呢&#xff1f; 1.2 什么是输入设备的应用编程&#xff1f; 1.3 input子系统 1.4 数据读取流程 1.5 应用程序如何解析数据 1.5.1 按键类事件&#xff1a; 1.5.2 相对位移事件 1.5.3 绝对位移事件 二 读取 struct input_e…

MyBatis整合Spring Boot扫描Mapper相关配置

MyBatis是一款 Java 平台的优秀数据库映射框架&#xff0c;支持 XML 定义或注解&#xff0c;免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 针对 Spring 提供 Mapper 扫描注解&#xff1a; 集成 Spring Boot 时&#xff0c;可以通过 MapperScan 注解&#xff0…

【论文阅读】2736. 最大和查询-2023.11.17

题目&#xff1a; 2736. 最大和查询 给你两个长度为 n 、下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;另给你一个下标从 1 开始的二维数组 queries &#xff0c;其中 queries[i] [xi, yi] 。 对于第 i 个查询&#xff0c;在所有满足 nums1[j] > xi 且 nums2[j]…

大数据-之LibrA数据库系统告警处理(ALM-12050 网络写吞吐率超过阈值)

告警解释 系统每30秒周期性检测网络写吞吐率&#xff0c;并把实际吞吐率和阈值&#xff08;系统默认阈值80%&#xff09;进行比较&#xff0c;当检测到网络写吞吐率连续多次&#xff08;默认值为5&#xff09;超过阈值时产生该告警。 用户可通过“系统设置 > 阈值配置 >…

2023年09月 Scratch(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 下列哪项内容是不可以修改的?( ) A:角色名称 B:造型名称 C:舞台名称 D:背景名称 答案:C 第2题 要给“古诗朗诵”作品录制配音,可以使用下列哪个按钮?( ) A: B: C:…