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;elsereturn 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);//选择Lres+=dfs(i-1,L,0,E);//选择Tres+=dfs(i-1,L,T,max(E-1,0));//选择Eres+=(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;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在Ubuntu 23.10部署KVM并创建虚拟机?

正文共&#xff1a;1114 字 21 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们之前对OpenStack醉过一次简单介绍&#xff08;什么是OpenStack&#xff1f;&#xff09;&#xff0c;OpenStack本身是一个云管理平台&#xff0c;它本身并不提供虚拟化功能&#xff0c;而是依赖…

【2012年数据结构真题】

41题 &#xff08;1&#xff09; 最坏情况下比较的总次数 对于长度分别为 m&#xff0c;n 的两个有序表的合并过程&#xff0c;最坏情况下需要一直比较到两个表的表尾元素&#xff0c;比较次数为 mn-1 次。已知需要 5 次两两合并&#xff0c;故设总比较次数为 X-5, X 就是以 N…

机器学习中的偏差漂移:挑战与缓解

一、介绍 机器学习算法已在各个行业得到广泛采用&#xff0c;在自动化流程、制定数据驱动决策和提高效率方面发挥着关键作用。然而&#xff0c;他们也面临着挑战&#xff0c;其中一个重要的问题是偏见。机器学习模型中的偏差可能会导致不公平和歧视性的结果&#xff0c;并对现实…

Webpack 性能优化 二次编译速度提升3倍!

本文作者为 360 奇舞团前端开发工程师 Rien. 本篇文章主要记录 webpack 的一次性能优化。 现状 随着业务复杂度的不断增加&#xff0c;项目也开始变得庞大&#xff0c;工程模块的体积也不断增加&#xff0c;webpack 编译的时间也会越来越久&#xff0c;我们现在的项目二次编译的…

ChatGPT 从零到一打造私人智能英语学习助手

近几年&#xff0c;随着智能化技术的发展和人工智能的兴起&#xff0c;越来越多的应用程序开始涌现出来。在这些应用中&#xff0c;语音识别、自然语言处理以及机器翻译等技术都得到了广泛的应用。其中&#xff0c;聊天机器人成为了最受欢迎的人工智能应用之一&#xff0c;它们…

Word文档处理:用Python轻松提取Word文档图文数据

将内容从Word文档中提取出来可以方便我们对其进行其他操作&#xff0c;如储将内容存在数据库中、将内容导入到其他程序中、用于AI训练以及制作其他文档等。使用Spire.Doc for Python提供了一个简单的方法直接提取Word文档中的文本内容&#xff0c;包括文本和图片&#xff0c;而…

Airtest:各平台的剪切板功能汇总

1. 前言 一直以来&#xff0c;大家都还挺关注 Airtest是否有剪切板功能 的。从Airtest1.3.1版本起&#xff0c;我们新增了Android、iOS设备的剪切板功能&#xff0c;自此&#xff0c;3大平台的剪切板功能就齐全啦。 正好趁这个机会&#xff0c;我们给各大平台的剪切板功能做个…

测试Bard和ChatGPT关于法规中劳动时间的规定,发现chatgpt更严谨

Bard是试验品&#xff0c;chatgpt是3.5版的。 首先带着问题&#xff0c;借助网络搜索&#xff0c;从政府官方网站等权威网站进行确认&#xff0c;已知正确答案的情况下&#xff0c;再来印证两个大语言模型的优劣。 想要了解的问题是&#xff0c;在中国&#xff0c;跟法定工作…

装机必备!这5款免费软件,你值得拥有!

​ 目前win7渐渐退出视野&#xff0c;大部分人都开始使用win10了&#xff0c;笔者在日常的工作和使用中&#xff0c;为了能够让效率的大提升&#xff0c;下载了不少软件&#xff0c;以下的软件都是个人认为装机必备&#xff0c;而且都是可以免费下载。 1.屏幕亮度调节——Twin…

Netty+SpringBoot 打造一个 TCP 长连接通讯方案

项目背景 公司某物联网项目需要使用socket长连接进行消息通讯&#xff0c;捣鼓了一版代码上线&#xff0c;结果BUG不断&#xff0c;本猿寝食难安&#xff0c;于是求助度娘&#xff0c;数日未眠项目终于平稳运行了&#xff0c;本着开源共享的精神&#xff0c;本猿把项目代码提炼…

python爬取网站数据,作为后端数据

一. 内容简介 python爬取网站数据&#xff0c;作为后端数据 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a; 三.主要流程 3.1 通过urllib请求网站 里面用的所有的包 ! pip install lxml ! pip install selenium ! pip install…

【数据结构】希尔排序(最小增量排序)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;数据结构 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有帮助…

蓝桥杯 大小写转换

islower/isupper函数 islower和issupper是C标准库中的字符分类函数&#xff0c;用于检查一个字符是否为小写字母或大写字母 需要头文件< cctype>,也可用万能头包含 函数的返回值为bool类型 char ch1A; char ch2b; //使用islower函数判断字符是否为小写字母 if(islower(…

Flutter NestedScrollView 、SliverAppBar全解析,悬浮菜单的应用

在我们开发过程中经常会使用到悬浮菜单的使用&#xff0c;当我们滑动到指定位置后&#xff0c;菜单会自动悬浮。 实现效果如下&#xff08;左为滑动前、右为滑动后&#xff09;&#xff1a; 上述便是通过NestedScrollView 、SliverAppBar实现的效果&#xff0c;通过两个控件我…

文件包含_具体场景、zip、php相关问题

具体场景—上传可控的文件 具体场景—远程文件包含 具体场景—伪协议

基于plc的柔性制造系统供料检测单元的设计(论文+源码)

1.系统设计 本次基于plc的柔性制造系统供料检测单元的设计&#xff0c;其系统结构框图如图2.1所示&#xff0c;系统采用西门子S7-200 型号的PLC作为主控制器&#xff0c;并结合温度传感器&#xff0c;重量传感器&#xff0c;限位开关&#xff0c;变频器等器件来构成整个系统&a…

0基础如何学习软件测试?10分钟给你安排明白

先上一张学习路线&#xff1a; 在测试行业已经呆了5年多了&#xff0c;也算得上行业经验资深了吧&#xff0c;基本上也是摸清了这个行业的发展。 所以今天也想对有转行想法的朋友分享一下经验&#xff0c;能够让你对这个行业有个大致的了解和对以后的发展有所规划&#xff0c;…

07.智慧商城——商品详情页、加入购物车、拦截器封装token

01. 商品详情 - 静态布局 静态结构 和 样式 <template><div class"prodetail"><van-nav-bar fixed title"商品详情页" left-arrow click-left"$router.go(-1)" /><van-swipe :autoplay"3000" change"onCha…

机械人必须要了解的丝杆螺母参数

丝杆螺母是机械中重要的零部件之一&#xff0c;主要用于将旋转运动转化为直线运动&#xff0c;或者将直线运动转化为旋转运动。只有正确了解丝杆螺母的参数&#xff0c;才能进行选型。 1、螺纹规格&#xff1a;丝杆螺母的螺纹规格是按照国家标准进行分类的&#xff0c;常见的有…

HTTP HTTPS 独特的魅力

目录 HTTP协议 HTTP协议的工作过程 首行 请求头&#xff08;header&#xff09; HOST Content-Length​编辑 User-Agent&#xff08;简称UA&#xff09; Referer Cookie 空行 正文&#xff08;body&#xff09; HTTP响应详解 状态码 报文格式 HTTP响应格式 如何…