第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组题目试做(中)【本期题目:回文数组,挖矿】

OK,继续写我们的第十五届蓝桥杯大赛软件赛省赛Python 大学 C 组题目,后面的题目比较麻烦了,所以我们再分两期讲。

这一期的题有 : 回文数组,挖矿

文章目录

回文数组

题目链接:回文数组

基本思路

题目中给出我们两种操作:

相邻的两个数 +1 或 -1

一个数 +1 或 -1

对于样例 1,2,3,4

让它成为回文数组,我们是不是让 1 和 4 相互趋近,让 1 加数 或者 让 4 减数。

再转换一下思路,是不是 让 1 加数,让 4 减数 ,不论是哪一种,是不是最后的效果是一样的。

也就是说,我们只需要操作一半的数组 让它变成和另一半一样是不是就成功了。

第一步,获取半个数组每个数需要变化的情况

然后,我们就是要对数组进行操作了,这题是获取最优解,所以采用贪心的思想,也就是说,在操作的时候优先选择同加同减。

第二步,贪心思想优先选择同加同减操作

OK,分析先到这,我们来试试对不对。

代码

python 复制代码
import os
import sys

# 请在此输入您的代码
n = int(input())

lst = list(map(int, input().split()))
change = []
for i in range(n // 2):
    change.append(lst[i] - lst[n - 1 - i])
# 上面是获取出一半的数组需要变化的情况

cnt = 0
for i in range(len(change)):
    cnt += abs(change[i])
    if i < len(change) - 1:
        if change[i] > 0 and change[i + 1] > 0:
            change[i + 1] -= min(change[i], change[i + 1])
        if change[i] < 0 and change[i + 1] < 0:
            change[i + 1] -= max(change[i], change[i + 1])
print(cnt)

挖矿

题目链接:挖矿

思路分析

看完题目,我的想法就是枚举。

首先,我们先排除多次折返,因为如果多次折返,那么肯定不如往一个方向走到头,再折返这样多。

那么剩下的就是一次折返 和 不折返。

基本思路是这么回事,然后我们想想怎么实现:

例如说:

向左:

走 1 步 ------ 获得 1 矿石

走 2 步 ------ 获得 1 矿石

走 3 步 ------ 获得 2 矿石

走 4 步 ------ 获得 2 矿石

......

在遍历每次的情况之后,再加上此时向右走最多能获得的矿石的数量。

这是不是就是大伙熟悉的求区间和,也就是前缀和

如果不熟悉前缀和,可以看看我这期文章:前缀和 ------ 算法如此简单

分析到这,开始试一试吧。

代码

python 复制代码
n, m = map(int, input().split())
lst = list(map(int, input().split()))
r = [0 for _ in range(int(1e6) + 10)] #比 0 大的数
l = [0 for _ in range(int(1e6) + 10)] #比 0 小的数
Max = 0
x = 0 #只用来记录 0 处是否有矿的情况
for i in lst:
    if i > 0:
        r[i] += 1
    elif i < 0:
        l[-i] += 1 # 位置都是绝对值的位置
    else:
        x = 1

for i in range(1, m+1):
    l[i] += l[i-1]
    r[i] += r[i-1]
# 上面生成两个记录矿数的前缀和列表
# 下面开始遍历所有情况

for i in range(1, m+1):
    # 先向左再向右
    t = l[i] # t用来记录挖矿数
    if m - 2 * i > 0:
        t += r[m - 2 * i] #加上右边最多能采到的矿的数目
    Max = max(Max, t) #取最大值

    # 先向右再向左
    t = r[i]  # t用来记录挖矿数
    if m - 2 * i > 0:
        t += l[m - 2 * i]  # 加上左边最多能采到的矿的数目
    Max = max(Max, t)  # 取最大值

print(Max + x)

感谢大伙观看,别忘了三连支持一下

大家也可以关注一下我的其它专栏,同样精彩喔~

下期见咯~

相关推荐
CTA量化套保5 小时前
近期零基础量化学习:先分阶段,再用 AI 检查缺口
人工智能·python
wp123_15 小时前
硬件元器件笔记|IPX8 防水 Type‑C 母座安费诺 124018802112A 与 TONEVEE TY48086‑24A 分析
c语言·开发语言·笔记
清水白石0086 小时前
Python 死锁排查全攻略:从线程卡死到锁依赖定位与工程化修复
linux·网络·python
Elias不吃糖6 小时前
Langfuse 入门:Trace、Prompt、Dataset、Experiment、Evaluator
前端·python·prompt·langfuse
luj_17686 小时前
桥牌思维启示:系统设计的模块化架构
c语言·开发语言·c++·经验分享·算法
TechWayfarer7 小时前
批量查IP归属地,在线API、脚本、离线库怎么选?三种方案实测对比
网络·python·网络协议·tcp/ip
七牛开发者8 小时前
为什么 Go 很适合 AI 辅助开发?
数据库·人工智能·python·elasticsearch·log4j
caimouse8 小时前
ReactOS 图形系统分析(16):字符串对象 — STROBJ(string.c)
c语言·开发语言
河南凹凸环境艺术设计8 小时前
性价比高的民宿酒店设计企业
大数据·人工智能·python
wuyk55511 小时前
Python 第三章:列表 List
服务器·开发语言·python