Python解题 - CSDN周赛第19期 - 醉酒的狱卒

news2024/9/22 8:30:47

本期题目依然难度不高,可惜状态不佳,未能取得满分,而且解题的思路也没能做到最简,直到赛后才想到还可以有另外的有趣的解法。我想这本身也是比赛的乐趣之一吧,不识庐山真面目,只缘身在此山中。


第一题:幼稚班作业

幼稚园终于又有新的作业了。老师安排同学用发给同学的4根木棒拼接成一个三角形。当然按照正常的逻辑,如果不能拼接成三角形。必然要折断某个木棍来拼接三角形。可是懒惰的小艺当然不会费力了!如果拼接不成三角形小艺就会把它凭借成类似边长 1 1 2的伪三角形。如果伪三角形都拼接不成那就不交作业!

输入:输入四根木棍的长度。

输出:拼接成正常三角形输出”1”,伪三角形输出”0”,否则输出”-1”。

示例
输入

1 2 3 4

输出1

分析

作为第一题,通常来讲应该是最简单的,但本题却有明显的误导。题目给了四根木棒,很自然地会让人想到要把四根木棒都用掉,也就是说把其中两根拼在一起,再和另外两根试着组三角形。但是从最后的结果来看,只要检查其中三根是否能够组成三角形就能得到答案了。于是,按照三角形的基本规律,两条短边之和必定大于第三条边,我们只要将四根木棒按照长度排序,检查前三根和后三根能否满足这个条件即可。

其实这里用到了一个小技巧,四根木棒选三根,按照排列组合,应该有4种选择:1/2/3、1/2/4、1/3/4、2/3/4,为什么我们只检查1/2/3和2/3/4两种组合呢?因为1/2/3/4按长度递增,如果1/2/3不能满足条件的话,1/2/4必然也不会满足(1+2如果不大于3的话,更不可能大于4),同理,如果2/3/4不能满足的话,1/3/4也不会满足(2+3如果不大于4的话,1+3更不可能大于4)。所以只要检查1/2/3和2/3/4的组合是否能够组成三角形即可。

参考代码

arr = list(map(int, input().strip().split()))
arr.sort()
if arr[0]+arr[1] > arr[2] or arr[1]+arr[2] > arr[3]:
    print(1)
elif arr[0]+arr[1] == arr[2] or arr[1]+arr[2] == arr[3]:
    print(0)
else:
    print(-1)

第二题:环形单向链表

给一个单向链表,若其中包含环,请完善EntryNodeOfLoop方法找出该链表的环的入口结点,否则,输出null。要求空间复杂度为O(1)。

示例
输入

4

1 2

2 3

3 4

4 2

输出2

分析

从以往关于数据结构的考题来看,官方此类考题从来都没有真正的考察过数据结构的构建,所以本题和是不是链表的关系并不大,希望以后能有所改善。另外,此题自相矛盾,题目暗示了有可能存在多个环,但是,单向链表的每个节点都只指向一个节点(要不怎么叫“单向”?),如何存在多个环?

如果链表中存在环,则要么最后一个节点指向了第一个节点,要么有一个节点被指向了两次(术语叫入度为2),根据给出的示例,可以看到每一行给出的两个数a和b,代表了a指向b,所以我们只要判断:① b里是否出现了第一个节点,② b里是否有某个节点出现了2次。但是这样只能通过90%的测试用例(想必这也是大多数人的得分都是97.5的原因)。由于题目描述有问题,只能猜测那10%的数据并不是单向链表,换句话说,a有可能指向了多个节点,甚至可能指向了自己,但是也没有机会进行测试了。反正题目都这样了,那就随便写写吧。

参考代码

n = int(input().strip())
arr = []
for _ in range(n):
    a, b = map(int, input().strip().split())
    arr.append((a,b))
a, b = list(zip(*arr))
if 1 in b:
    print(1)
else:
    r = max(b, key=b.count)
    if b.count(r) > 1:
        print(r)
    else:
        print("null")

第三题:影分身

已知字符串str。字符串str包含字符’x’,’y’。如果相邻的两个字符不同,消除两个字符,优先从左边进行消除。xyyx - > yx -> 

示例:

示例一示例二
输入

xyyyy

xxxyyyy

输出yyyy

分析

本题比较简单,按照题意模拟字符串的消除即可得到答案。需要注意的是,如果x和y消除了,左右的字符串要合在一起再进行比较,比如xxxyyyy,中间的xy消除后,还要继续比较左边第二个x和右边第二个y合并在一起的情况,也就是继续消除,直到最后不存在相邻的x和y为止。

参考代码1

s = input().strip()
i = 1
while i < len(s):
    if s[i-1] != s[i]:
        s = s[:i-1] + s[i+1:]
        i = max(i-2, 0)
    i += 1
print(s)

此外,也不难看出,因为相同个数的“x”和“y”相互抵消,最终的结果必然只有一种字符,那么其实我们只要统计出字符串中“x”和“y”分别出现了多少次,然后将出现次数多的那个字符打印出来即可,打印的个数就等于两者出现次数的差值。如果是0,也不用特判,打印空字符串即可。

参考代码2

s = input().strip()
from collections import Counter
r = Counter(s)
d = r["x"] - r["y"]
if d < 0:
    print("y"*(-d))
else:
    print("x"*d)

第四题:醉酒的狱卒

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

输入:

第一行输入包含一个正整数 t ,表示有 t 行数据,下面每一行都包含一个介于5和100之间(含5和100)的整数,即轮数 n 。

输出:

对于每一行,必须打印出监狱有 n 个牢房时越狱的囚犯人数。

示例:

示例
输入

2

5

100

输出

2

10

分析

此题描述十分冗长,但其实十分简单,可以说也是一道脑筋急转弯。按照题意,狱卒会依次操作1到 n 的倍数的牢房(关上、打开的状态切换),所以如果一个牢房的数字存在偶数个因数,比如牢房6,存在4个因数:1/2/3/6,也就是说狱卒会在第1、2、3、6次喝醉的时候去操作牢房6,那么该牢房打开、关闭、打开、关闭,最终状态就是关闭。而如果一个整数存在奇数个因数,则此数必然是完全平方数,比如牢房16,存在5个因数:1/2/4/8/16,则其最终的状态必然是打开。于是此题就变成了求 n 之内的整数有多少个完全平方数,也就是 \sqrt{n} 。

参考代码1

t = int(input().strip())
result = []
for _ in range(t):
    n = int(input().strip())
    result.append(int(n**0.5))
for i in result:
    print(i)

但是,其实问哥在比赛中并没有想到这一点,刷题的人很容易会将题目与刷过的题目联想在一起,此题让我瞬间想到了洛谷的另外一道题(现在看来,本题更加简单),于是没来得及细想,就直接套用了集合异或运算的解法。

算法复杂度自然比不上前面 \sqrt{n} 的常数阶解法,但也算是拓宽了一种思路吧。

参考代码2

t = int(input().strip())
result = []
for _ in range(t):
    n = int(input().strip())
    cell = set(range(1, n+1))
    for i in range(2, n+1):
        cell ^= set(range(i, n+1, i))
    result.append(len(cell))
for i in result:
    print(i)

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

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

相关文章

【阶段一】Python快速入门03篇:数据结构-元组、字典与集合

本篇的思维导图: 数据结构-元组 元组的概念 元组(tuple)虽然与列表类似,但也有不同之处,元组的元素不能修改;元组使用小括号,而列表使用中括号。 新建一个元组 元组的创建比较简单,直接将一组数据元素用小括号括起来即可。

第1章 生物和生物圈

张惠怡*&#xff0c;张钊* (萧县城东初级中学&#xff0c;淮北师范大学计算机科学与技术学院&#xff0c;安徽 淮北&#xff0c;安徽 宿州) *These authors contributed to the work equllly and should be regarded as co-first authors. &#x1f31e;欢迎来到生物的世界 …

校招前端二面高频vue面试题

vue-router中如何保护路由 分析 路由保护在应用开发过程中非常重要&#xff0c;几乎每个应用都要做各种路由权限管理&#xff0c;因此相当考察使用者基本功。 体验 全局守卫&#xff1a; const router createRouter({ ... }) ​ router.beforeEach((to, from) > {// .…

【LeetCode每日一题】——263.丑数

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【时间频度】九【代码实现】十【提交结果】一【题目类别】 数学 二【题目难度】 简单 三【题目编号】 263.丑数 四【题目描述】 丑数 就是只包含质因数 …

3GPP R17 RedCap

什么是RedCap RedCap&#xff0c;即Reduced Capability的简称&#xff0c;在早期的3GPP讨论过程中&#xff0c;它也被称为NR Light。RedCap是针对IoT场景&#xff0c;为了降低终端复杂度、成本和功耗而提出。相比NR标准版本&#xff0c;RedCap主要在如下几个方面做了简化&#…

C++语言级别的多线程

1.线程概念 好处&#xff1a;可以跨平台&#xff1a;windows / linux / mac 线程间的互斥&#xff1a;mutex / lock_quard / unique_lock 线程间的通信&#xff1a;condition_variable atomic : 原子类型 基于CAS操作的原子类型 线程安全的 sleep_for :睡眠 C语言层面调用thre…

配置Debian11服务器安装SSH,创建新用户并允许远程SSH远程登录,并禁止root用户远程SSH登录

一、在 Debian 中添加 sudo 用户 1.创建新用户 首先&#xff0c;要创建用户&#xff0c;当前用户必须是 root 用户或者 sudo 用户。 使用下面adduser 命令创建一个用户名为test的sudo用户&#xff0c;按照提示输入密码&#xff0c;使用 adduser 命令&#xff0c;还会创建用户…

(三分钟)速览传统边缘检测算子

边缘检测的传统方法&#xff1a; 图像边缘是图像最基本的特征&#xff0c;所谓边缘(Edge) 是指图像局部特性的不连续性。灰度或结构等信息的突变处称之为边缘。例如&#xff0c;灰度级的突变、颜色的突变,、纹理结构的突变等。边缘是一个区域的结束&#xff0c;也是另一个区域…

如何在星巴克连接家中Windows台式机?(安卓,iOS, Windows, macOS配合frp公网iP实现)...

zhaoolee 最近热衷于和海外热心老哥们交换硬盘中的单机游戏资源(BT下载)&#xff0c;家中有Windows台式机&#xff0c; 适合长时间挂机下载BT资源&#xff0c;zhaoolee希望能随时连接到Windows台式机新增下载任务&#xff0c;安装体积超大的主机游戏。 另外&#xff0c;公司有一…

Docker常用命令 - 黑马学习笔记

Docker服务命令 # 启动docker服务 systemctl start docker # 停止docker服务 systemctl stop docker # 查看docker状态 systemctl status docker # 重启docker服务 systemctl restart docker # 设置docker开机自启动 systemctl enable dockerDocker镜像命令 # 查看镜像&#…

MySQL--》MySQL数据库以及可视化工具的安装与使用—保姆级教程

目录 数据库简介 MySQL数据库的安装 配置MySQL环境变量 MySQL数据库的启动与使用 MySQL图形化管理工具 Navicat Preminum工具的使用 数据库简介 大多数情况下&#xff0c;特别是企业级应用中&#xff0c;将数据保存到可掉电式存储设备中供以使用是非常重要的&#xff0c…

牛客2022跨年场

​ F题使用python&#xff0c;就是加了一个end \0&#xff0c;然后寄了好多。 A 猜群名 小沙为了这场元旦比赛绞尽脑汁&#xff0c;他现在在每个题目中藏入了一个字&#xff0c;收集所有的字&#xff0c;并将按照题号排列成一句话即可通过本题**!** 其次关于本场比赛难度预…

jmap 和jstack使用

jmap jmap是JDK提供的一个可以生成Java虚拟机的堆转储快照dump文件的命令行工具 1.查看整个JVM内存状态 jmap -heap [pid]2.查看JVM堆中对象详细占用情况 jmap -histo [pid]3.导出整个JVM 中内存信息&#xff0c;可以利用其它工具打开dump文件分析&#xff0c;例如jdk自带的…

Faster RCNN网络源码解读(Ⅸ) --- ROIAlign、TwoMLPHead、FastRCNNPredictor部分解析

目录 一、回顾以及本篇博客内容概述 二、代码解析 2.1 FasterRCNNBase类 2.1.1 forward正向传播 2.2 FasterRCNN类 2.2.1 roi_heads定义 2.3 TwoMLPHead类&#xff08;faster_rcnn_framework.py&#xff09; 2.4 FastRCNNPredictor类 2.5 RoIHeads类&#xff08;roi_…

JavaWeb:用户注册登录案例

1.1 用户登录 1.1.1 需求分析 用户在登录页面输入用户名和密码&#xff0c;提交请求给LoginServlet在LoginServlet中接收请求和数据[用户名和密码]在LoginServlt中通过Mybatis实现调用UserMapper来根据用户名和密码查询数据库表将查询的结果封装到User对象中进行返回在LoginSe…

用或不用大O来优化代码(选择排序)

本文内容借鉴一本我非常喜欢的书——《数据结构与算法图解》。学习之余&#xff0c;我决定把这本书精彩的部分摘录出来与大家分享。 目录 写在前面 1.选择排序 2.选择排序实战 3.选择排序的实现 4.选择排序的效率 5.忽略常数 6.大O的作用 7.总结 写在前面 大 O 是一…

Java面向对象详解(下)

文章目录&#x1f4d6;前言&#xff1a;&#x1f3c5;封装• 封装的概念• 封装的好处• 封装的核心理解&#x1f3c5;继承• 继承的概念•继承的特点● 何时使用继承&#xff1f;● 继承的形式● 继承的传递性● 继承的构造方法&#x1f9f8;super关键字&#x1f387;用途&…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.14 平移、旋转、缩放

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1te4y1L7Mu 本节讲解平移、旋转、缩放这些变换操作 1. 关联信号槽 首先&#xff0c;在 widget.cpp 的构造中&#xff0c;为 “变换” 复选框&#xff0c;关联信号槽 // 平移、旋转、缩放 conn…

leetcode 2439. 最小化数组中的最大值

给你一个下标从 0 开始的数组 nums &#xff0c;它含有 n 个非负整数。 每一步操作中&#xff0c;你需要&#xff1a; 选择一个满足 1 < i < n 的整数 i &#xff0c;且 nums[i] > 0 。将 nums[i] 减 1 。将 nums[i - 1] 加 1 。 你可以对数组执行 任意 次上述操作&…

程序的环境与预处理 程序的编译与链接

目录 1.程序的翻译环境和执行环境 ​编辑 2.编译链接 运行环境 3.预处理 预定义符号 #define #与## 带副作用的宏参数 宏和函数的对比 命名约定 ​编辑 #undef​编辑 命令行定义 ​编辑 条件编译 文件包含 嵌套文件包含 4.其他预处理指令 1.程序的翻译环境和…