Python解题 - CSDN周赛第43期

感觉周赛越来越无趣了,基本都是考过的题目。上期周赛也是,4道题都曾考过,问哥也都写过题解,奖品也不吸引人,实在没什么好写了。

回想前段时间用力过猛,刷了C站大部分OJ题,以致于现在看到题目就直接套答案了。甚至于误打误撞,发现了周赛的测试链接,上了一次处罚名单。。。嗯(无辜脸)。。。

本期还是全部考过,除了第二题没写过题解,这里就把它补上吧。


第一题:判断胜负

已知两个字符串A,B。连续进行读入n次。每次读入的字符串都为A|B。输出读入次数最多的字符串。

分析

17期考过,可以参考问哥之前的题解。不过其实也没啥好解的,就是比较两个字符串哪个出现次数最多,平局就输出“dogfall”——顺便学个英文单词。


第二题:小豚鼠搬家

小豚鼠排排坐。 小艺酱买了一排排格子的小房子n*m,她想让k只小豚鼠每只小豚鼠都有自己的房子。 但是为了不浪费空间,她想要小房子的最外圈尽量每行每列都有一只小豚鼠居住(小豚鼠也可以住在中间的格子,只需保证房子最外围的行和列至少住一只豚鼠即可,无需每行每列都有豚鼠)。 小艺酱想知道自己有多少种方案安排小豚鼠。

输入描述:输入整数n,m,k。(1<=n,m<=20,0<=k<=n*m)

输出描述:输出方案数,答案对1e9+7取模。

示例:

输入3 3 2
输出2

分析

也曾在13期考过,但是网上靠谱的题解不多。

本题本质上就是排列组合,总共有 n*m 个格子,要放进去 k 只小豚鼠,如果不加任何限制的话,学过数学的都知道,总共有 C_{n*m}^{k}=\frac{(n*m)!}{k!*(n*m-k)!} 种方案。但是题目要求最外面一圈的每行每列(实际上就是顶底两行与左右边两列)至少各有一只小豚鼠。在检查这个条件时,小豚鼠的数量可以重复计入。比如给的例子中,只有两只小豚鼠,于是只能这样放才能满足要求(也就是两种方案):

明白了题目的要求,我们可以先思考一下最朴素的穷举做法:先找出所有 C_{n*m}^{k} 种可能,然后逐一检查每种可能里,上、下、左、右四条边里有没有豚鼠。

这很容易,只要使用 python 内置的 combinations 函数,找出所有从坐标 (0,0) 到 (n-1,m-1) 的所有坐标中取出 k 个的组合,然后逐一检查其中是否存在横坐标为 0 和 n-1,以及纵坐标为 0 和 m-1 的坐标。

这种方法可以保证找到答案,但绝对会超时。因为我们其实并不关心每种方案的具体坐标有哪些,而只需要知道方案的数量。于是,我们拿总的方案数,减去不符合要求的方案不就可以了?

我们已知总的方案数是 C_{n*m}^{k},那么不符合要求的有哪些方案呢?

  1. 一条边没有豚鼠:
    1. 顶边或底边没有豚鼠:2*C_{(n-1)*m}^{k}
    2. 左边或右边没有豚鼠:2*C_{n*(m-1)}^{k} 
  2. 两条边没有豚鼠:
    1. 顶边和底边没有豚鼠:C_{(n-2)*m}^{k}
    2. 左边和右边没有豚鼠:C_{n*(m-2)}^{k}
    3. 顶边和左边、顶边和右边、底边和左边、底边和右边没有豚鼠:4*C_{(n-1)*(m-1)}^{k}
  3. 三条边没有豚鼠:
    1. 顶边、左边、底边,或顶边、右边、底边没有豚鼠:2*C_{(n-2)*(m-1)}^{k}
    2. 左边、顶边、右边,或左边、底边、右边没有豚鼠:2*C_{(n-1)*(m-2)}^{k}
  4. 四条边没有豚鼠:C_{(n-2)*(m-2)}^{k} 

但是别急,当我们拿总数减去四次一条边没有豚鼠的情况的时候,实际上,我们重复减去了那些两条边、三条边的情况,所以我们要把两条边的情况加回来,但是这样一来,又重复加上了三条边的情况,所以还要将三条边的情况减去。。。所以,相信你也已经看出来了,实际上这题考察的又是容斥原理

如果我们用 S 代表总的方案的集合,A,B,C,D 各自代表上、下、左、右四条边上没有豚鼠的情况的集合,可以用数学公式表示如下:

ans = S-A-B-C-D+A\cap B+ A\cap C+ A\cap D+ B\cap C+ B\cap D+ C\cap D - A\cap B\cap C-A\cap B\cap D-A\cap C\cap D-B\cap C\cap D+A\cap B\cap C\cap D

一言以蔽之:将四种集合进行排列组合,如果组合中包含的集合个数是奇数,就减去,如果是偶数,就加上。

所以,回到我们这道题,结合我们刚才列出的所有情况,就可以得到答案如下:

ans = C_{n*m}^{k}-2*C_{(n-1)*m}^{k}-2*C_{n*(m-1)}^{k}+C_{(n-2)*m}^{k}+C_{n*(m-2)}^{k}+4*C_{(n-1)*(m-1)}^{k}-2*C_{(n-2)*(m-1)}^{k}-2*C_{(n-1)*(m-2)}^{k}+C_{(n-2)*(m-2)}^{k}

代码就省略了吧,无非是用代码计算这个公式罢了。 


第三题:醉酒的狱卒

某监狱有一个由n个牢房组成的大厅,每个牢房紧挨着。每个牢房里都有一个囚犯,每个牢房都是锁着的。一天晚上,狱卒感到无聊,决定玩一个游戏。在第一轮,他喝了一杯威士忌,然后跑下大厅,打开每个牢房的锁。在第二轮比赛中,他喝了一杯威士忌,然后跑下大厅,锁上每隔一个的牢房的锁(牢房2、4、6…)。在第三轮比赛中,他喝了一杯威士忌,然后跑下大厅。他每隔三个牢房(第3、6、9号牢房)就去一次。如果牢房被锁上了,他就把它打开;如果牢房门打开了,他就锁上牢房。他重复 n 轮,喝最后一杯,然后昏倒。一些囚犯(可能为零号)意识到他们的牢房被解锁且狱卒丧失了行动能力。他们就可以立即逃跑。现在根据牢房数量,确定有多少囚犯越狱。

分析 

19期考过,题干很复杂,实际很简单。本题存在 O(1) 的解法,可以参考问哥之前的题解。


第四题:会议安排

开会了!作为一个集体,开会的时候桌子当然是需要和老大相邻的!(老大可能坐在桌子上边) 小艺被分配到排桌椅的活,可是小艺的力气都用在吃上了,怎么可能搬动这些桌椅呢。 她决定用现有的布局当作是会议座位安排。每个桌子分配一个人。互相连接相同字符表示一个桌子,如UVV表示2张桌子,UVU则表示3张桌子。小艺想知道选择某个桌子之后老大身边能围多少人?

分析

20期考过,可以参考问哥之前写的题解。

关于字符串的处理,问哥一直觉得很麻烦,所以如果有更好的做法,还请告诉我,谢谢。

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

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

相关文章

Elasticsearch:索引状态是红色还是黄色?为什么?

在我之前文章 “Elasticsearch&#xff1a;如何调试集群状态 - 定位错误信息” 中&#xff0c;我有详细介绍如何调试集群状态。在今天的文章中&#xff0c;我将详细介绍如何故障排除和修复索引状态。 Elasticsearch 是一个伟大而强大的系统&#xff0c;特别是创建一个可扩展性极…

MySQL函数、视图、存储过程及触发器

前言 MySQL在我们工作中都会用到&#xff0c;那么我们最常接触的就是增删改查&#xff0c;而对于增删改查来说&#xff0c;我们更多的是查询。但是面试中&#xff0c;面试官又不会问你什么查询是怎么写的&#xff0c;都是问一些索引啊&#xff0c;事务啊&#xff0c; 底层结构…

Hbase 介绍

Hbase 简介 Hbase 是一个开源的非关系型的分布式数据库&#xff0c;运用于HDFS文件系统之上&#xff0c;可以容错地存储海量稀疏的数据。Hbase是一个高可靠、高性能、面向列、可伸缩、实时读写的分布式数据库&#xff0c;主要用来存储非结构化和半结构化的松散数据 。 Hbase的…

ChatGPT中文在线官网-如何与chat GPT对话

怎么下载ChatGPT中文版 ChatGPT是一种基于Transformer架构的自然语言处理技术&#xff0c;其中包含了多个预训练的中文语言模型。这些中文ChatGPT模型大多数发布在Github上&#xff0c;可以通过Github的源码库来下载并使用&#xff0c;包括以下几种方式&#xff1a; 下载预训练…

高并发写场景:库存扣减

在设计商品的库存扣减逻辑时&#xff0c;可能一开始想到的(伪)代码是&#xff1a; <?php /*** 商品库存扣减** param int $skuId 商品ID* param int $num 库存扣减数量** return bool 扣减成功返回true&#xff0c;失败返回false*/ function stock_decr($skuId, $num) {…

Go是一门面向对象编程语言吗

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;tonybai|慕课网讲师 Go语言已经开源13年了&#xff0c;在近期TIOBE发布的2023年3月份的编程语言排行榜中&#xff0c;…

【hello Linux】Linux基本指令(下)

目录 1. more 指令&#xff1a;分批查看文件 1.1 more -n 文件名&#xff1a;查看文件前 n 行 1.2 more 文件名&#xff1a;屏幕输满 补充指令&#xff1a; 2. less 指令 2.1 less -N 文件名 2.2 /字符串&#xff1a;向下搜索“字符串”的功能 3. head 指令 3.1 head 文件名 3…

4.Java逻辑控制语句

Java逻辑控制语句 在实际生活中&#xff0c;我们的生活不是一成不变的&#xff0c;很多时候需要我们去选择&#xff0c;大到人生的十字路口&#xff0c;小到今天晚上吃什么&#xff0c;选择无处不在。小的选择决定了我们一件小事的走向&#xff0c;大的选择可能会改变我们人生…

基于多目标粒子群优化算法的计及光伏波动性的主动配电网有功无功协调优化(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

JavaScript -- 对象

1. 概念 对象是 JavaScript 数据类型的一种&#xff0c;可以理解为是一种无序的数据集合 2. 对象的使用 2.1 对象的声明 let 对象名 {} let 对象名 new Object() 2.2 属性和方法 数据描述性的信息称为属性&#xff0c;如人的姓名、身高、年龄、性别等&#xff0c;一般是…

蓝桥杯之贪心

蓝桥杯之贪心1055.股票买卖II104.货仓选址AcWing112.雷达设备1235.付账问题1239.乘积最大K是奇数&#xff0c;需要转化为K是偶数的情况&#xff0c;于是先取一个数&#xff0c;为了使得结果最大&#xff0c;取最大的数&#xff08;正数的话绝对值最大&#xff0c;负数的话(K是奇…

java版工程项目管理系统源码 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

ava版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示1…

托福高频真词List12 // 附托福TPO阅读真题

目录 4.5单词 生词 熟词 真题 4.5单词 生词 irreversiblepermanentadj.无法挽回的&#xff0c;永久的manipulateskillfully usedhandlev.操控monumentalenormousgreat and significantadj.极大的&#x1f9f8;retardslowv.放缓&#x1f9f8;subsistencesurvivaln.生存 wit…

Redis应用问题及解决

目录 一.缓存穿透 1.1 问题描述 1.2 解决方案 二.缓存击穿 2.1 问题描述 2.2 解决方案 三.缓存雪崩 3.1 问题描述 3.2 解决方案 当数据库压力变大&#xff0c;导致服务访问数据库响应变慢&#xff0c;导致服务的压力变大&#xff0c;最终可能导致服务宕机。 一.缓存穿透 1.1 …

【数据结构】栈与队列经典oj题

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…

[Jenkins自动化] 实现远端linux自动化部署方式(上篇)

目录 本篇文章简介: 简单易上手, 轻松实现jenkins实现自动化部署(上) 1. 安装jenkins方式 -> 1.1 windows版本 --->1.1.1 直接安装 修改安装路径 设置端口号 9000为例 ---> 1.1.2 创建工作空间即可 (起名为pzy) -> 1.2 linux版本(暂无) -> 1.3 docker版…

chapter-4-数据库语句

以下课程来源于MOOC学习—原课程请见&#xff1a;数据库原理与应用 考研复习 概述 SQL发展 注&#xff1a;关键词是哪些功能&#xff0c;尤其第一个create alter drop是定义功能 1.SQL功能强大&#xff0c;实现了数据定义、数据操纵、数据控制等功能 2.SQL语言简洁&#xff…

redis基础总结-常用命令

redis常用指令3. 常用指令3.1 key 操作分析3.1.1 key应该设计哪些操作&#xff1f;3.1.2 key 基本操作3.1.3 key 扩展操作&#xff08;时效性控制&#xff09;3.1.4 key 扩展操作&#xff08;查询模式&#xff09;3.2 数据库指令3.2.1 key 的重复问题3.2.2 解决方案3.2.3 数据库…

Linux Shell 实现一键部署Redis6

redis 前言 Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 redis 参考 redis下载RedisDesktopManagerd…

ThreadPoolExecutor获取原始异常

ThreadPoolExecutor作用 ThreadPoolTaskExecutor是Spring框架提供的一个线程池实现&#xff0c;它是基于Java的ThreadPoolExecutor实现的。ThreadPoolTaskExecutor可以管理线程池中的线程&#xff0c;以满足多线程并发执行任务的需要。 FutureTask作用 FutureTask的主要作用…
最新文章