Python解题 - CSDN周赛第37期
创始人
2025-05-29 10:05:49
0

本期有新题,但是因为测试数据放水,并不难。而老题也是很容易可以找到答案。总的来说,难度不大,没有需要特别讲解的地方。


第一题:幼稚班作业

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

分析

19期考过,好像并不遥远。以前写的题解在此。

老样子,主要的坑在于理解题意。4根木棒并不是要全部用掉,而只是从里面选出3根。于是,排序 + 三角形合法性判断。


第二题:异或和

小张找到了一个整数 N,他想问问你从 1 到 N 的所有不同整数的异或和是多少, 请你回答他的问题。(1\leq N \leq 100000

分析

友好的数据范围使得此题成为大水题,循环 1e5 次毫无压力。于是只要循环累计 1 到 N 的异或运算即可通过此题,复杂度 O(N)

但实际上,本题存在 O(1) 的解法,如果 N 的范围取到 1e9,甚至更大,或许才有竞赛的意义。

  • 当 N 是偶数时
    • 如果 N 能被 4 整除,答案是 N
    • 如果 N 不能被 4 整除,答案是 N+1
  • 当 N 是奇数时
    • 如果 N+1 能被 4 整除,答案是 1
    • 如果 N+1 不能被 4 整除,答案是 0

感兴趣的同学可以自己推导看看。 


第三题:大整数替换数位

以字符串的形式给你一个长度为 M 的整数 N,请你计算出对这个数进行一次操作后模 9 的值为 1 的所有可能的不同操作方式。

在一次操作中, 我们可以选择 N 的一个数位 N[i],并把它替换成另一个不同的 0 到 9 范围之内的数 B,当且仅当它们选择的 i 或 B 不同时两种操作方式不同。

输入描述:第一行包含一个整数 M (1 <= M <= 100000)。第二行包含一个大整数 N。

输出描述:输出一个整数, 代表对 N 执行一次操作后使 N 模 9 的值为 1 的所有可能的不同操作方式数量。

示例:

示例
输入

4

2345

输出5

分析

有趣的一道脑筋急转弯,仿佛让我回到了学生时代。

从小时候得到的经验可得,一个数如果能被 3、6、9 这样的 3 的倍数整数,那么它的各个数位的数字加起来就应该能被 3、6、9 整除。同理,如果一个数模 9 余 1,那么这个数的各个数位的数字之和也必然模 9 余 1。想到这一点,这道题的答案就显而易见了。

第一步,计算出整数 N 的各个数位之和(共 M 个数字)。

第二步,将上一步求得的和对 9 取余,根据余数的不同来进行(稍微)不同的操作:

余数操作(使该整数模 9 余 1)
0某位数字加 1,或者减 8
1某位数字加 9,或者减 9
2某位数字加 8,或者减 1
3某位数字加 7,或者减 2
4某位数字加 6,或者减 3
5某位数字加 5,或者减 4
6某位数字加 4,或者减 5
7某位数字加 3,或者减 6
8某位数字加 2,或者减 7

 ** 这里由原数模 9 的余数得到操作的数字(比如加1、减8)可以得到数学公式,即使没有数学公式,列出 9 条判断语句也未尝不可。:D

第三步,对原整数从头到尾遍历每一位数字,如果该位数字进行操作后得到的数字合法(加和减单独检查),就记为合法的操作,结果加 1。

所谓操作后得到的数字合法,就是检查上下界。比如,我们得到的操作数如果是加1、减8,而某位数字是 9,很显然,9+1=10,需要进位,就必须改变其他数位,显然不合法;而 9-8=1,也就是可以把 9 改成 1,合法。总结来说,合法的条件是某位数字:

  • 加上操作数小于10
  • 减去操作数大于等于0

最后的结果就是遍历完所有数位,把检查结果累加,复杂度 O(M)


第四题:莫名其妙的键盘

有一个神奇的键盘,你可以用它输入a到z的字符,然而每当你输入一个元音字母(a,e,i,o,u其中之一)的时候,已输入的字符串会发生一次反转! 比方说,当前输入了tw,此时再输入一个o,此时屏幕上的字符串two会反转成owt。 现给出一个字符串,若用该键盘输入,有多少种方法可以得到?

输入描述:一行一个字符串,长度不超过200,全部是由小写字母组成。

输出描述:一个整数,代表方案数量

示例:

示例
输入ac
输出2

分析

由结果字符串逆推输入过程即可。逆推的时候只要考虑以下情况:

  • 如果字符串的最后一位是元音字母
    • ① 如果第一位也是元音字母:说明最后输入的是首位字符,发生了翻转。
    • 如果第一位不是元音字母:不可能出现这种情况,因为末尾元音字母会发生翻转。
  • 如果字符串的第一位是元音字母
    • ② 最后输入的是首位字符,发生了翻转。
    • ③ 最后输入的是末尾字符,未发生翻转。
  • ④ 其他情况,最后输入的就是末尾的字符

只要依次把最后输入的字符“剥掉”,然后递归调用上述检查,最后把合法的方案加在一起即可。

举个例子。如果我们要得到的字符串是 abcdefg,推导的过程如下图(从下往上,圆圈数字代表了上述的 4 种情况):

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
JAVA多线程知识整理 Java多线程基础 线程的创建和启动 继承Thread类来创建并启动 自定义Thread类的子类&#...
【洛谷 P1090】[NOIP... [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G ...
国民技术LPUART介绍 低功耗通用异步接收器(LPUART) 简介 低功耗通用异步收发器...
城乡供水一体化平台-助力乡村振... 城乡供水一体化管理系统建设方案 城乡供水一体化管理系统是运用云计算、大数据等信息化手段࿰...
程序的循环结构和random库...   第三个参数就是步长     引入文件时记得指明字符格式,否则读入不了 ...
中国版ChatGPT在哪些方面... 目录 一、中国巨大的市场需求 二、中国企业加速创新 三、中国的人工智能发展 四、企业愿景的推进 五、...
报名开启 | 共赴一场 Flu... 2023 年 1 月 25 日,Flutter Forward 大会在肯尼亚首都内罗毕...
汇编00-MASM 和 Vis... Qt源码解析 索引 汇编逆向--- MASM 和 Visual Studio入门 前提知识ÿ...
【简陋Web应用3】实现人脸比... 文章目录🍉 前情提要🌷 效果演示🥝 实现过程1. u...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
windows安装JDK步骤 一、 下载JDK安装包 下载地址:https://www.oracle.com/jav...
分治法实现合并排序(归并排序)... 🎊【数据结构与算法】专题正在持续更新中,各种数据结构的创建原理与运用✨...
在linux上安装配置node... 目录前言1,关于nodejs2,配置环境变量3,总结 前言...
Linux学习之端口、网络协议... 端口:设备与外界通讯交流的出口 网络协议:   网络协议是指计算机通信网...
Linux内核进程管理并发同步... 并发同步并发 是指在某一时间段内能够处理多个任务的能力,而 并行 是指同一时间能够处理...
opencv学习-HOG LO... 目录1. HOG(Histogram of Oriented Gradients,方向梯度直方图)1...
EEG微状态的功能意义 导读大脑的瞬时全局功能状态反映在其电场结构上。聚类分析方法一致地提取了四种头表面脑电场结构ÿ...
【Unity 手写PBR】Bu... 写在前面 前期积累: GAMES101作业7提高-实现微表面模型你需要了解的知识 【技...