Python解题 - CSDN周赛第11期 - 圆桌请客(脑筋急转弯)

news2024/7/4 4:39:38

本来想着没有all pass就不写题解了,但在赛后对最后一题纠结了好久,然后发现是个类似脑筋急转弯的题,自己与正确答案只差一层纸,实在有点不吐不快。另外本期考了经典的背包问题的模板题,也值得记录下来,加深记忆。

先表扬一下CSDN的进步:

  • 后面两道难度较高的题目增加了“提示”内容,解释了示例中的答案是怎样计算的,帮助各位选手尽快理解题意。(虽然问哥还是花了不少时间阅读理解。。。)

再谈谈不足:

  1. 第三题竟然出现在当天的每日一练里,也就是说,如果我起得早,把每日一练做了,就会在几个小时后开始的比赛中遇见刚刚做过的题。。。若不是故意的,只能说“比赛”和“每日一练”这两个子版块的工作人员相互之间沟通太少,或者每日一练的选题纯粹就是随机事件,没有人工核查。不过也无所谓,反正这题也是模板题。
  2. 如果CSDN鼓励大家多多使用每日一练,就应该把用户体验做得好一点,排版太丑就不说了,各有所爱,关键问哥经常会遇到如果在纸上演算,或者本地窗口调试程序,而把每日一练的窗口晾上十几分钟后,再切回来就提示“权限不足”、“登录异常”,要求重新登录,而有时候还必须关闭浏览器才能再次打开,这实在是太不爽了。不知道这是不是只是我遇到的问题。

第一题:圆小艺

最近小艺酱渐渐变成了一个圆滑的形状——球!!小艺酱开始变得喜欢上球!小艺酱得到n个同心圆。小艺酱对着n个同心圆进行染色。相邻的圆范围内不能有相同的颜色。相隔一层的圆颜色相同。小艺酱想知道圆最外层的那种颜色全部染了多少?

分析

“全部染了多少”。。。加上“面积”两个字这么难吗?可能问哥的阅读理解一直比较弱,看完题目的第一反应竟是计算周长,而更加崩溃的是,题目给出的两个示例,如果使用周长计算的话,得出的结果和正确答案是一样的!于是单单在这第一道题上,问哥就因为阅读理解不过关(嗯,题目没有错-_-|)浪费了十几分钟。

在仔细又读了N遍题目以后,问哥才意识到这是要计算圆环。好吧,简单的数学题。

同心圆如下图所示,我们要求从最外层算起颜色相同的圆环的总面积。

圆环的面积 = 外圆的面积 - 内圆的面积,这自然不用说,使用步长为2的遍历即可,不过此题有个稍微需要注意的地方就是,圆的数量如果是奇数,最里面的圆的面积是要完整加进结果的,所以,为了代码的一致性,当n为奇数的时候,我们可以在最里面添加一个半径为0的“圆”,这样最后一个圆的面积减去0,就等于完整的面积了。

参考代码

def solution(n, arr):
    from math import pi
    a = sorted(arr,reverse=True)
    if n%2: a.append(0)
    result = 0
    for i in range(0,n,2):
        result += pi*(a[i]**2-a[i+1]**2)
    return f"{result:.3f}"

另外还有下面几个小坑:

  1. 题目输入的圆的半径数组arr是无序的,所以第一步还要先对其进行排序,推荐倒序排序,这样在尾部添加一个半径为0的圆的时间复杂度是常数级。不过单就此题而言,正序倒序区别不大。
  2. 圆周率\pi的取值要尽量精确,否则可能出现结果误差。Python直接导入内置math模块的pi即可。
  3. 最后别忘记要严格返回小数点后3位,即使最后结果得到的是一个整数,也要返回xx.000

第二题:K皇把妹

存在n个节点,目标节点在m。每个节点有自己的权值a。在权值k内(含k值)选择一个权值非0节点且与目标节点距离最近。节点i与节点j的距离为abs(i-j)

分析

这题就是字面意思,也比较好懂。要找符合要求的最近的节点,于是从节点m使用lr两个指针同时向左、右进行遍历即可。从1开始依次增加距离,找到符合条件(非0、小于等于k)的节点即中断遍历、返回距离。

参考代码

def solution(n, m, k, arr):
    if n==1: return 0
    res = 1
    while True:
        r = m+res-1
        l = m-res-1
        if r<n:
            if arr[r]!=0 and arr[r]<=k:
                return res
        if l>=0:
            if arr[l]!=0 and arr[l]<=k:
                return res
        res += 1

当然,极端情况只有1个节点的时候,距离为0。 


第三题:筛选宝物

已知存在n个宝物,每个宝物都有自己的质量m和价值v,在考虑选择宝物时只能选择总质量小于等于M的方案,请问在最优方案下选择宝物,能获取到最大价值V是多少?

分析

经典模板背包基础题,经典到问哥只要复制以前回答别人的问答答案就好:

假设宝物/物品数量为3(n=3),能选择的总质量(背包容量)最高6公斤(M=6),则可列出动态规划表如下:

首先先创建一个(0 to 3, 0 to 6) 的二维数组,默认全为0(表示背包里面什么都没有),使用指针ij分别表示上表的横、纵坐标。由于本题默认的答题模板里使用的是vector二维数组来保存了宝物的重量和价值,所以vector[i-1][0] 就表示了第i个宝物的重量,而vector[i-1][1] 则表示了第i个宝物的价值。然后就可以开始状态转移进行填表的操作了:

  1. 当背包容量只有1公斤,而我只有物品1(vector[0])的时候,i=1, j=1。物品1的重量为2公斤(vector[0][0]),所以啥也放不了,dp[1][1] 的价值就等于上一行(注意:状态转移是由左向右、自上而下)的dp[0][1] 的价值,也就是0;
  2. 当背包容量为2公斤,而我只有物品1的时候,i=1, j=2。正好可以放下物品1,所以最大价值为3(vector[0][1]);
  3. 当背包容量大于2公斤,而我只有物品1,最大价值都为物品1的价值,所以dp[1][2] 到 dp[1][6] 的最大价值都是3(从dp[i-1][j] 转移而来)。

第一层转移完毕,然后考虑物品2(vector[1]):

  1. 当背包容量只有1公斤,而我有物品1和物品2的时候,i=2, j=1。因为物品2的重量为1公斤,所以只能放物品2,dp[2][1] 的价值就等于上一行dp[1][1] 的价值(0,表示不放物品2),和放了物品2(j-vector[i-1][0] 表示背包容量减去当前物品的容量,大于等于0则表示能放下当前物品,所以价值为当前物品的价值)二者相比较取大的那个:物品2的价值2。
  2. 当背包容量为2公斤,而我有物品1和物品2,i=2, j=2。要么放物品1,要么放物品2,不能同时放,所以同上面的比较过程,放入物品1的价值最大,所以dp[2][2] 为3。
  3. 当背包容量为3公斤,而我有物品1和物品2,i=2, j=3。可以同时放物品1和物品2(j-vector[i-1][0] 为放了当前物品后背包剩余的容量,而之前已经计算过剩余容量的最大价值为3,也就是物品1的价值),所以经过比较,dp[2][3] 为二者价值之和,也就是5。
  4. 当背包容量大于3公斤的推导过程同上。

第二层转移完毕,而由此我们也可以推出状态转移方程:

拥有i种宝物、质量为j的最大价值 = (如果放不下当前的宝物,则等于其余宝物质量为j的最大价值)或者(如果放得下当前宝物,就等于不放当前宝物、只放其余宝物的质量为j的最大价值 与 放了当前宝物后,剩下的质量对应的最大价值,二者较大的一个)

。。。描述得忒费劲,翻译成代码就比较清楚了:

参考代码

def solution(n, M, vector):
    dp = [[0]*(M+1) for _ in range(n+1)]
    for i in range(1,n+1):
        for j in range(1,M+1):
            if j-vector[i-1][0]>=0:
                dp[i][j] = max(dp[i-1][j],dp[i-1][j-vector[i-1][0]]+vector[i-1][1])
            else:
                dp[i][j] = dp[i-1][j]
    return dp[n][M]

第四题:圆桌

有N个客人与足够多张的圆桌。主人安排每位客人坐在一个圆桌边,但是每位客人希望自己左右边上分别有一些空座位,不然会觉得害羞。注意,如果一个客人所在的圆桌只有他一个人,那么他左边的空座位数量就是他右边的空座位数量。试问主人需要准备多少个座位,才能让每个客人舒适的坐下。

分析

“此题代码简单,但思维难度却不小。”

问哥看了别人的题解后,感觉本题更像是脑筋急转弯,想明白了,一点就通;而如果想不通,是很难找到解题方法的。

洛谷的原题,贪心算法,写的题解太多了(主要是想通了以后就太简单了)。问哥就不啰嗦了,简单来讲,就是假设所有人都围成一圈的话,尽量让要求左边空位多的人要求右边空位多的客人相邻,然后取二者最大的空位数,该逻辑对一个客人单独一桌的情况同样成立。然后将所有两两组队的最大空位相加,最后再加上客人数n即可。——这部分逻辑问哥一开始就明白了(当然还是浪费了二十分钟在阅读理解上-_-|),但是问哥比较难以想通的是,为什么一个客人的左边空位和右边空位可以拆开来单独进行排序?如果客人左右边空位的数量相差过大,他的左边配对了客人后,右边还能配对吗?介于比赛时间此时已所剩无几,问哥也没有继续求证下去,但是如果有时间画个图,就会清楚地发现:即使把左、右边空位拆开分别排序、组对,也一样、并且一定是可以配对成功的,很简单的道理:左边和右边,不管是多少,它们的数量恒等于人数

举例:假设有5位客人A、B、C、D、E,对应的颜色以及对左右空位的要求(数字)如下,按照解题思路,将客人们左、右空位拆开,再进行排序后配对:

得到的结果一定可以围成一个圆(或多个圆,取决于排序后配对的位置):

使用图论应该可以进行数学上的证明,但是问哥数学底子薄弱,就到此为止吧,明白意思就可以了,哈哈 :D

参考代码

def solution(n, vector):
    l, r = zip(*vector)
    l.sort(reverse=True)
    r.sort(reverse=True)
    res = 0
    for i in range(n):
        res += max(l[i],r[i])
    return res+n

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

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

相关文章

全志科技A40i国产开发板——性能参数综合测试

本次测试板卡是创龙科技旗下,一款基于全志科技A40i开发板,其接口资源丰富,可引出双路网口、双路CAN、双路USB、双路RS485等通信接口,板载Bluetooth、WIFI、4G(选配)模块,同时引出MIPI LCD、LVDS LCD、TFT LCD、HDMI OUT、CVBS OUT、CAMERA、LINE IN、H/P OUT等音视频多媒…

宿主机与开发板网络共享

宿主机网络共享 一、关键步骤 11. 网络共享简介 目标&#xff1a;宿主机可以用ssh连接开发板&#xff0c;开发板可以上网。 步骤&#xff1a;宿主机与目标机用网线直连&#xff0c;宿主机采用IP共享的方式连接开发板&#xff1b; 配置项IP开发板IP192.168.0.232宿主机以太网I…

Java 序列化原理

我的网站 | 我的博客 | 序列化解析工具 概念 Java为我们提供了一种默认的对象序列化机制&#xff0c;通过这种机制可以将一个实例对象写入到IO流中&#xff0c;当然这种IO流可以是文件流、网络流或者其他什么流。 代码的写法 ObjectOutputStream 对象输出流&#xff0c;用…

2022新一代设备维修管理系统助力企业降本增效

设备的维修是指企业或者设备密集型单位为了保持、恢复并提升设备使用寿命而定期对设备进行状态的维护&#xff0c;备件的更换&#xff0c;发生故障后的维修和恢复&#xff0c;从而让设备保证良好的运营状态&#xff0c;提升设备的可利用性并保证产能和设备安全。 大型企业在设…

C++11标准模板(STL)- 算法(std::merge)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 归并两个已排序的范围 st…

关于Mysql使用left join写查询语句执行很慢的问题解决

目录 &#xff08;一&#xff09;前言 &#xff08;二&#xff09;正文 1. 表结构/索引展示 &#xff08;1&#xff09;表结构 &#xff08;2&#xff09;各表索引情况 2. 存在性能问题的SQL语句 3. 解决思路 &#xff08;1&#xff09;执行计划思路调优 &#xff08;…

数字图像处理(入门篇)二 颜色空间

在对图像进行处理时&#xff0c;前提图像必须是以数据的形式来描述的&#xff0c;而颜色空间就是用数据来表征图像颜色的一种方法。颜色信息由三个独立的分量来综合表示&#xff0c;这三个独立的分量构成了一个三维的坐标空间&#xff0c;每种颜色信息都在该空间中被唯一地表示…

Java-泛型实验

1.定义一个学生类Student&#xff0c;具有年龄age和姓名name两个属性&#xff0c;并通过实现Comparable接口提供比较规则&#xff08;返回两个学生的年龄差&#xff09;&#xff0c; 定义测试类Test&#xff0c;在测试类中定义测试方法Comparable getMax(Comparable c1, Compar…

基于springboot农机电招平台设计与实现的源码+文档

摘要 随着农机电招行业的不断发展&#xff0c;农机电招在现实生活中的使用和普及&#xff0c;农机电招行业成为近年内出现的一个新行业&#xff0c;并且能够成为大群众广为认可和接受的行为和选择。设计农机电招平台的目的就是借助计算机让复杂的销售操作变简单&#xff0c;变高…

Kubernetes资源调度之节点亲和

Kubernetes资源调度之节点亲和 Pod节点选择器 nodeSelector指定的标签选择器过滤符合条件的节点作为可用目标节点&#xff0c;最终选择则基于打分机制完成。因此&#xff0c;后者也称为节点选择器。用户事先为特定部分的Node资源对象设定好标签&#xff0c;而后即可配置Pod通过…

YOLO X 改进详解

YOLO X 主要改进&#xff1a; Anchor-Free: FCOSDecoupled detection headAdvanced label assigning strategy Network structure improvement Decoupled detection head 对比于YOLO V5, YOLO X 在detection head上有了改进。YOLO V5中&#xff0c;检测头是通过卷积同时预…

ROS2--概述

ROS2概述1 ROS2对比ROS12 ROS2 通信3 核心概念4 ros2 安装5 话题、服务、动作6 参数参考1 ROS2对比ROS1 多机器人系统&#xff1a;未来机器人一定不会是独立的个体&#xff0c;机器人和机器人之间也需要通信和协作&#xff0c;ROS2为多机器人系统的应用提供了标准方法和通信机…

时间序列:时间序列模型---自回归过程(AutoRegressive Process)

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 这次我们构造一个由无限的白噪声实现&#xff08;white noise realization) 组成的时间序列&#xff0c;即。这个由无限数目的项组成的值却是一个有限的值&#xff0c;比如时刻的值为&#xff0c; 而…

基于PHP+MySQL校园餐饮配送系统的设计与实现

随着我国国民经济的稳步发展,我国的大学生也越来越多,但是大部分学生都是没有时间和环境去自己做饭的,有很多也不会做,而很多食堂的菜品有难以下咽,所以很多人就采取了订餐的方式来进行购买美食,但是现在很多网站都是只能进行点餐,而没有智能推荐功能,本系统在原来的外卖基础上…

【Linux】文件系统

目录&#x1f308;前言&#x1f337;1、磁盘的组成&#x1f361;1.1、磁盘的物理结构&#x1f362;1.2、磁盘的存储结构&#x1f363;1.3、磁盘的逻辑结构&#x1f338;2、文件系统&#x1f364;2.1、文件系统的结构&#x1f365;2.2、inode如何与数据块建立联系&#x1f366;2…

2021年全国研究生数学建模竞赛华为杯C题帕金森病的脑深部电刺激治疗建模研究求解全过程文档及程序

2021年全国研究生数学建模竞赛华为杯 C题 帕金森病的脑深部电刺激治疗建模研究 原题再现&#xff1a; 一、背景介绍   帕金森病是一种常见的神经退行性疾病&#xff0c;临床表现的特征是静止性震颤&#xff0c;肌强直&#xff0c;运动迟缓&#xff0c;姿势步态障碍等运动症…

R语言生存分析可视化分析

生存分析指的是一系列用来探究所感兴趣的事件的发生的时间的统计方法。 生存分析被用于各种领域&#xff0c;例如&#xff1a; 癌症研究为患者生存时间分析&#xff0c; “事件历史分析”的社会学 在工程的“故障时间分析”。 在癌症研究中&#xff0c;典型的研究问题如下…

Java中如何处理时间--Date类

文章目录0 写在前面1 介绍Date类2 构造方法举例2.1 Date()2.2 Date(long date)3 Date类中常用方法4 写在最后0 写在前面 在实际业务中&#xff0c;总会碰到关于时间的问题&#xff0c;例如收集当年的第一季度的数据。第一季度也就是当年的一月一日到三月三十一日。如何处理时间…