牛客周赛 Round 48 解题报告 | 珂学家


前言

alt


题解

这场感觉有点难,D完全没思路, EF很典,能够学到知识.

E我的思路是容斥+贡献,F很典,上周考过一次,引入虚拟节点质数(有点像种类并查集类似的技巧).


欢迎关注

珂朵莉 牛客周赛专栏

珂朵莉 牛客小白月赛专栏


A. 小红的整数自增

题型: 签到

贪心即可,所以值往最大值靠拢即可

arr = list(map(int, input().split()))z = max(arr)res = 0
for v in arr:res += (z - v)print (res)

B. 小红的伪回文子串(easy)

思路: 暴力

暴力枚举+模拟即可

s = input()def compute(cs):res = 0i, j = 0, len(cs) - 1while i < j:if cs[i] != cs[j]:res += 1i+=1j-=1return resn = len(s)
res = 0
for i in range(n):for j in range(i, n):res += compute(s[i:j+1])print (res)

C. 小红的01串取反

思路: 模拟

模拟即可,顺序执行相同操作

  • 最后一个元素不等,即无解
  • 最后一个元素相等,即有解,且按序操作最优
n = int(input())
s1 = input()
s2 = input()res = []
ss1 = list(s1)
ss2 = list(s2)for i in range(n - 1):if ss1[i] != ss2[i]:res.append([i+1, i+2])ss1[i] = '0' if ss1[i] == '1' else '1'if i + 1 < n:ss1[i+1] = '0' if ss1[i+1]=='1' else '1'if ss1[-1] != ss2[-1]:print (-1)
else:print (len(res))for (a, b) in res:print (a, b)

D. 小红的乘2除2

思路: 枚举+前后缀拆解

可以枚举除2的点,然后快速寻找那个那个点乘2收益最大

所以它的思路非常的直接

  • 预处理x2的结果
  • 枚举除2的点

由于不确定x2的点的位子在枚举点那一侧,所以引入前后缀拆解

这题绕的地方在于, x2和除2太接近,彼此会互相影响

所以这里需要打个补丁,即在(-1, 0, 1)的位子,特殊枚举x2的结果

这就是大致的思路

时间复杂度为 O ( n ) O(n) O(n)

n = int(input())
arr = list(map(int, input().split()))def evalute(arr):res = 0n = len(arr)for i in range(n - 1):res += abs(arr[i] - arr[i + 1])return respre = [0] * n
suf = [0] * ndef gain(i):res = 0if i >= 1:res += abs(arr[i] * 2 - arr[i - 1]) - abs(arr[i] - arr[i - 1])if i < n - 1:res += abs(arr[i] * 2 - arr[i + 1]) - abs(arr[i] - arr[i + 1])return resdef divgain(i):res = 0if i >= 1:res += abs(arr[i] // 2 - arr[i - 1]) - abs(arr[i] - arr[i - 1])if i < n - 1:res += abs(arr[i] // 2 - arr[i + 1]) - abs(arr[i] - arr[i + 1])return resfrom math import inf
pre[0] = inf
for i in range(1, n):pre[i] = min(pre[i - 1], gain(i - 1))suf[n - 1] = inf
for i in range(n - 2, -1, -1):suf[i] = min(suf[i + 1], gain(i + 1))# 前后缀拆解
from math import inf
res = inf
now = evalute(arr)def recompute(arr, i):acc = 0for k in (-1, 0, 1, 2):if i + k >= 1 and i + k < n:acc += abs(arr[i + k] - arr[i + k - 1])return accfor i in range(n):res = min(res, now + divgain(i) + min(pre[i - 1] if i >= 1 else inf, suf[i + 1] if i + 1 < n else inf))        acc = recompute(arr, i)cb = arr[i]arr[i] = cb // 2for k in (-1, 0, 1):if i + k < 0 or i + k >= n:continueold = arr[i + k]arr[i + k] = old * 2res = min(res, now + recompute(arr, i) - acc)arr[i + k] = oldarr[i] = cbprint (res)

E. 小红的伪回文子串(hard)

思路: 容斥+贡献

正难则反

正面求解很难,所以试试反向解法,就是统计相同的字符对

总的配对数 - 相同配对数

而这边的相同配对(i, j),其实有一个加权,这个加权

w = m i n ( i + 1 , n − j ) w = min(i+1, n - j) w=min(i+1,nj)

可以先写一个 O ( n 2 ) O(n^2) O(n2)的解法

一旦写出 O ( n 2 ) O(n^2) O(n2)的解法,基本上半只脚迈入成功的道路上了

因为这里能找到一个技巧点,使得时间复杂度降为 O ( N ) O(N) O(N)

s = input()
n = len(s)# 考虑贡献法
r = 0
for i in range(n):d = i + 1x = n - 1 - iif x >= i:r += d * (x - i)r += d * (d - 1) // 2else:d2 = (n - i - 1)r += (d2 + 1) * d2 // 2hash = [[] for _ in range(26)]for (i, c) in enumerate(s):p = ord(c) - ord('a')hash[p].append(i)res = 0
for i in range(26):ls = hash[i]m = len(ls)pre = [0] * (m + 1)for j in range(m):pre[j + 1] = pre[j] + (n - ls[j])# 双指针优化tmp = 0k = m - 1for j in range(m):while k >= 0 and n - ls[k] < ls[j] + 1:k -= 1if k > j:tmp += (k - j) * (ls[j] + 1)tmp += pre[m] - pre[k + 1]else:tmp += pre[m] - pre[j + 1]res += tmp# 容斥
print (r - res)

F. 小红的迷宫行走

思路: 引入虚节点 + 0-1BFS

  • 虚节点为质数
  • 节点到虚节点代价为0
  • 虚节点到节点代价为1

然后就跑一下0-1BFS,即可

h, w = list(map(int, input().split()))g = []
for _ in range(h):row = list(map(int, input().split()))g.append(row)from math import inf
dp = [[inf] * w for _ in range(h)]from collections import deque
from collections import defaultdict# 建图
cnt = defaultdict(list)es = [[[] for _ in range(w)] for _ in range(h)]for i in range(h):for j in range(w):k = 2v = g[i][j]while k * k <= v:if v % k == 0:cnt[k].append((i, j))es[i][j].append(k)while v % k == 0:v = v // kk += 1if v > 1:cnt[v].append((i, j))es[i][j].append(v)deq = deque()
deq.append((0, 0, 0, 0))
dp[0][0] = 0from collections import Counter
opt = Counter()from math import gcdwhile len(deq) > 0:op, y, x, c = deq.popleft()if op == 0:if y + 1 < h:if dp[y + 1][x] > c + 1:dp[y + 1][x] = c + 1deq.append((0, y+ 1, x, c + 1))if x + 1 < w:if dp[y][x + 1] > c + 1:dp[y][x + 1] = c + 1deq.append((0, y, x + 1, c+ 1))for v in es[y][x]:if v not in opt:opt[v] = cdeq.appendleft((1, v, 0, c))else:for (ty, tx) in cnt[y]:if dp[ty][tx] > c + 1:dp[ty][tx] = c + 1deq.append((0, ty, tx, c + 1))print (dp[-1][-1])

写在最后

alt

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

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

相关文章

Marin说PCB之total etch length规则知多少?

魔都上海最近迎来了一轮梅雨季节了&#xff0c;小编我上周就已经提前把被子衣服袜子都晒了一遍&#xff0c;省的后面一段时间下雨就不能晒了。这种阴雨绵绵的天气当然在家里睡觉最舒服了&#xff0c;上周留正当我在家里夏眠的时候&#xff0c;突然被一阵手机铃声吵醒了&#xf…

代码签名证书:保护你的软件,就像保护你的宝贝

Hey&#xff0c;大家好&#xff01;今天我们来聊聊一个听起来可能有点技术宅&#xff0c;但实际上超级重要的东西——代码签名证书。别担心&#xff0c;我会用最简单易懂的话来解释它&#xff0c;保证你看完这篇文章后&#xff0c;能对代码签名证书有个全新的认识&#xff01; …

苹果Mac安装adobe软件报错“installer file may be damaged”解决方案

最近Mac电脑系统的有小伙伴在安装PS、AI、AE、PR等软件&#xff0c;出现了一个错误&#xff0c;让人头疼不已&#xff0c;苦苦找寻&#xff0c;也找不到完美的解决方法。让我们来一起看看吧&#xff01; 很多小伙伴都喜欢苹果电脑&#xff0c;但是在安装外来软件时&#xff0c;…

Java后端 || ElementUI 显示后端树形表格数据

文章目录 1、前端源码2、数据库设计3、后端设计3.1、实体类3.2、Controller层3.3、具体树形列表后端代码实现 1、前端源码 ElementUI Table 链接 在此链接中找到 树形数据与懒加载 查看其JS源码&#xff0c;可知&#xff0c;每个菜单节点的子节点存放于children字段中&#x…

信息学奥赛初赛天天练-36-CSP-J2021阅读程序-ASCII、运算符优先级、二进制补码存储、模拟算法应用

PDF文档公众号回复关键字:20240626 2021 CSP-J 阅读程序2 1 阅读程序(判断题1.5分 选择题3分 共计40分 ) #include<stdio.h> #include<string.h>char base[64]; char table[256]; char str[256]; char ans[256];void init() {for(int i0;i<26;i) base[i]Ai;fo…

MySQL之可扩展性(四)

可扩展性 向外扩展 分片?还是不分片&#xff1f; 这是一个问题&#xff0c;对吧&#xff1f;答案很简单:如非必要&#xff0c;尽量不分片。首先看是否能通过性能调优或者更好的应用或数据库设计来推迟分片。如果能足够长时间地推迟分片&#xff0c;也许可以直接购买更大地服…

黑马程序员——Spring框架——day09——linux初级

目录&#xff1a; 前言 什么是Linux&#xff1f;为什么要学Linux 企业用人要求个人发展需要学完Linux能干什么 1).环境搭建2).常用命令3).安装软件4).项目部署小结2.Linux简介 主流操作系统Linux发展历史Linux系统版本Linux安装 安装方式介绍安装VMware安装Linux网卡设置安装S…

flink 处理函数和流转换

目录 处理函数分类 概览介绍 KeydProcessFunction和ProcessFunction 定时器TimeService 窗口处理函数 多流转换 分流-侧输出流 合流 联合&#xff08;Uniion&#xff09; 连接&#xff08;connect&#xff09; 广播连接流&#xff08;BroadcatConnectedStream&#xf…

数据结构——

1. 什么是并查集&#xff1f; 在计算机科学中&#xff0c;并查集&#xff08;英文&#xff1a;Disjoint-set data structure&#xff0c;直译为不数据结构交集&#xff09;是一种数据结构&#xff0c;用于处理一些不交集&#xff08;Disjoint sets&#xff0c;一系列没有重复元…

6毛钱SOT-23封装28V、400mA 开关升压转换器,LCD偏置电源和白光LED应用芯片TPS61040

SOT-23-5 封装 TPS61040 丝印PHOI 1 特性 • 1.8V 至 6V 输入电压范围 • 可调节输出电压范围高达 28V • 400mA (TPS61040) 和 250mA (TPS61041) 内部开关电流 • 高达 1MHz 的开关频率 • 28μA 典型空载静态电流 • 1A 典型关断电流 • 内部软启动 • 采用 SOT23-5、TSOT23…

input()函数——输入

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 input()函数可以提示并接收用户的输入&#xff0c;将所有的输入按照字符串进行处理&#xff0c;并返回一个字符串&#xff0c;input()函数的…

操作符详解(上) (C语言)

操作符详解&#xff08;上&#xff09; 一. 进制转换1. 二进制2. 二进制的转换 二. 原码 补码 反码三. 操作符的分类四. 结构成员访问操作符1. 结构体的声明2. 结构体成员访问操作符 一. 进制转换 1. 二进制 在学习操作符之前&#xff0c;我们先了解一些2进制、8进制、10进制…

modelsim做后仿真的一点思路

这是以TD_5.6.3_Release_88061生成的网表文件&#xff08;其他工具生成的网表文件类似&#xff09;&#xff0c;与modelsim联合进行门级仿真的样例&#xff0c;时序仿真与门级仿真的方法类似&#xff0c;只是增加了标准延时文件。 1、建立门级仿真工程 将门级网表和testbench添…

vivado SLR

描述 超级逻辑区&#xff08;SLR&#xff09;是包含在堆叠硅中的单个FPGA芯片 互连&#xff08;SSI&#xff09;设备。堆叠式硅互连&#xff08;SSI&#xff09;技术使用无源硅 具有微凸块和硅通孔&#xff08;TSV&#xff09;的内插器&#xff0c;用于组合多个FPGA管芯 切片&a…

【ARM Trace32(劳特巴赫) 使用介绍 2.7 -- bat 脚本传参数给 trace32 cmm 脚本】

请阅读【Trace32 ARM 专栏导读】 文章目录 bat 脚本传参数给 trace32脚本可变参数传入CMM 脚本接收参数运行BAT脚本bat 脚本传参数给 trace32脚本 在使用 Trace32 的过程中,如果每次都是通过GUI 界面来操作,是习惯使用命令行工作的人所不能忍受的!!!,那么能不同通过脚本…

如何下载植物大战僵尸杂交版,最全攻略来了

《植物大战僵尸杂交版》由热爱原版游戏的B站UP主“潜艇伟伟迷”独立开发&#xff0c;带来了创新的游戏体验。如果你是策略游戏的爱好者&#xff0c;下面这份全面的下载和游玩攻略将是你的理想选择。 游戏亮点&#xff1a; 杂交植物系统&#xff1a;结合不同植物特性&#xff0c…

CMakeList.txt 与makefile文件介绍

在C 项目中&#xff0c; 我们经常可以看到CMakeList.txt 文件和makefile文件&#xff0c; 那么它们分别有什么用呢&#xff1f; 下面的图示很好地解释了它们的作用以及两者之间的关系。

021.合并两个有序链表,递归和遍历

题意 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 难度 简单 标签 链表、排序 示例 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4]输入&#xff1a;l1 [], l2 [] 输出&#xff1a;[]…

七天速通javaSE:第四天 递归算法

文章目录 前言一、递归的介绍二、递归模型&#xff08;n!&#xff09;1 阶乘的定义&#xff1a;2. 阶乘的递归代码实现3. 递推与回归的内部逻辑三、练习 前言 本文将学习递归算法。在计算机科学中&#xff0c;递归算法是一种将问题不断分解 为同一类子问题来解决问题的方法。递…

vue3项目登录成功后根据角色菜单来跳转指定页面(无首页)

前言&#xff1a;需求不想要首页&#xff0c;登录什么角色跳转到这个角色经常使用的页面。&#xff08;例如&#xff1a;审核者角色的人输入用户名密码成功后就自动跳转到待审核的页面&#xff0c;仓库管理员登录成功则自动跳转到仓库列表&#xff09; 需要解决的点和想法&…