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

news2024/11/23 2:11:03

前言

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 = 0
    i, j = 0, len(cs) - 1
    while i < j:
        if cs[i] != cs[j]:
            res += 1
        i+=1
        j-=1
    return res
       
n = 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 = 0
    n = len(arr)
    for i in range(n - 1):
        res += abs(arr[i] - arr[i + 1])
    return res

pre = [0] * n
suf = [0] * n

def gain(i):
    res = 0
    if 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 res

def divgain(i):
    res = 0
    if 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 res

from 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 = 0
    for k in (-1, 0, 1, 2):
        if i + k >= 1 and i + k < n:
            acc += abs(arr[i + k] - arr[i + k - 1])
    return acc

for 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 // 2
    for k in (-1, 0, 1):
        if i + k < 0 or i + k >= n:
            continue
        old = arr[i + k]
        arr[i + k] = old * 2
        res = min(res, now + recompute(arr, i) - acc)
        arr[i + k] = old
    arr[i] = cb
    
print (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 + 1
    x = n - 1 - i
    if x >= i:
        r += d * (x - i)
        r += d * (d - 1) // 2
    else:
        d2 = (n - i - 1)
        r += (d2 + 1) * d2 // 2

hash = [[] 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 = 0
    k = m - 1
    for j in range(m):
        while k >= 0 and n - ls[k] < ls[j] + 1:
            k -= 1
        if 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 = 2
        v = 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 // k
            k += 1
        if v > 1:
            cnt[v].append((i, j))
            es[i][j].append(v)
            
deq = deque()
deq.append((0, 0, 0, 0))
dp[0][0] = 0

from collections import Counter
opt = Counter()

from math import gcd

while 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 + 1
                deq.append((0, y+ 1, x, c + 1))
        if x + 1 < w:
            if dp[y][x + 1] > c + 1:
                dp[y][x + 1] = c + 1
                deq.append((0, y, x + 1, c+ 1))
                
        for v in es[y][x]:
            if v not in opt:
                opt[v] = c
                deq.appendleft((1, v, 0, c))
    else:
        for (ty, tx) in cnt[y]:
            if dp[ty][tx] > c + 1:
                dp[ty][tx] = c + 1
                deq.append((0, ty, tx, c + 1))

print (dp[-1][-1])

写在最后

alt

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

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

相关文章

深度相机辅助导航避障(三):地面点云滤除

前面的章节介绍了坐标变换,以及如何设置深度相机的坐标变换。那就可以很直观从机器人的坐标系对深度相机扫描到的障碍物点云进行处理。 在实际应用中,机器人正确估计周围地形,对于道路的可通过性、路径规划和障碍物检测等方面都很重要。那么在获取深度相机点云数据后就得准…

pytorch基础知识Tensor算术运算

1、Tensor的基本概念 标量是零维的张量&#xff0c;向量是一维的张量&#xff0c;矩阵是二维的张量 2、Tensor的创建 import torch"""常见的几个tensor创建""" a torch.Tensor([[1,2],[3,4]]) #2行2列的 print(a, a.type()) print(torch.on…

在前端开发过程中如果函数参数很多,该如何精简

1. 在前端开发过程中如果函数参数很多&#xff0c;该如何精简 1.1. 对象参数&#xff08;对象字面量&#xff09;&#xff1a;1.2. 默认参数和解构赋值&#xff1a;1.3. 使用类或构造函数&#xff1a;1.4. 利用闭包或者高阶函数&#xff1a;1.5. 利用ES6的扩展运算符&#xff1…

利用ChatGPT优化程序员工作流程:实用案例分享

近年来&#xff0c;人工智能技术的迅猛发展给各行各业带来了翻天覆地的变化。作为其中的一员&#xff0c;程序员在工作中也受益匪浅。其中&#xff0c;ChatGPT的出现&#xff0c;更是成为优化程序员工作流程的得力助手。本文将通过多个实用案例&#xff0c;分享如何利用ChatGPT…

数据质量低下会造成什么后果?应从哪些维度衡量数据质量?

大数据时代的到来&#xff0c;预示着前所未有的商业机遇和洞察力。然而&#xff0c;要将这些海量数据中蕴含的巨大价值转化为实际的业务成果&#xff0c;一个关键的前提条件是必须确保所收集数据的质量。数据质量是大数据价值链上的第一道关卡&#xff0c;它的高低直接关系到数…

OpenCV中掩膜(mask)图像的创建和使用

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 功能描述 掩模图像&#xff08;Mask Image&#xff09;是一种特殊类型的形象数据&#xff0c;在图像处理和计算机视觉中扮演着重要角色。它通常是一个二维数组…

uniapp H5端使用百度地图

1、登录百度地图开放平台 https://lbsyun.baidu.com/&#xff08;没有账号则先去创建一个百度账号&#xff09; 2、进入百度地图开放平台控制台&#xff08;导航栏“控制台”&#xff09;&#xff0c;点击“应用管理”-“我的应用” 3、选择“创建应用”&#xff0c;应用模块选…

还不会找1688对标竞品?那你别说自己是做运营的

如何找正确的对标竞品 找到竞品→模仿竞品→学习竞品 找到正确的对标竞品&#xff0c;是至关重要的一个环节&#xff0c;如果你想要把流量做起来&#xff0c;却没找到正确的对标竞品是完全不可能的。因为你没有对标&#xff0c;你就完全不知道同行做什么动作才有流量&#xf…

Opencv学习项目2——pytesseract

上一次我们使用pytesseract.image_to_boxes来检测字符&#xff0c;今天我们使用pytesseract.image_to_data来检测文本并显示 实战教程 和上一次一样&#xff0c;添加opencv-python和pytesseract库 首先我们先来了解一下pytesseract.image_to_data pytesseract.image_to_data(…

k8s手撕架构图+详解

“如果您在解决类似问题时也遇到了困难&#xff0c;希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您的经历&#xff0c;欢迎在评论区留言&#xff0c;我们可以一起探讨解决方案。祝您在编程路上顺利前行&#xff0c;不断突破技术的难关&#xff0c;感谢您的阅读&a…

MySQL 超出月份最大日期(工作总结)

前几天帮同事修改了一个bug&#xff0c;这个bug是怎么造成的呢。先来看需求&#xff0c;系统需要统计某个月份的数据。很简单的一个需求。 同事的写的MySQL语句 SELECTREPLACE(FORMAT(sum(count_value),2), ,, ) as value,<if test"type day">count_date as…

Vue-内容渲染,属性渲染指令

内容渲染 在Vue中渲染元素&#xff0c;用双花括号{{}}的语法进行插值&#xff0c;称之为插值表达式 双花括号会渲染hi里面的值 <body><div id"app">{{hi}}</div> <script>const vm{data(){return{hi:hello world}}}const appVue.createAp…

【containerd】Containerd高阶命令行工具nerdctl

前言 对于习惯了使用docker cli的用户来说&#xff0c;containerd的命令行工具ctr使用起来不是很顺手&#xff0c;此时别慌&#xff0c;还有另外一个命令行工具项目nerdctl可供我们选择。 nerdctl是一个与docker cli风格兼容的containerd的cli工具。 nerdctl已经作为子项目加入…

u盘插到另一台电脑上数据丢失怎么办?提供实用的解决方案

在现代数字化生活中&#xff0c;U盘作为一种便携式存储设备&#xff0c;承载着我们重要的数据和信息。然而&#xff0c;有时当我们将U盘插入另一台电脑时&#xff0c;可能会遇到数据丢失的棘手问题。这可能是由于多种原因造成的&#xff0c;那么&#xff0c;U盘插到另一台电脑上…

cs与msf权限传递,与mimikatz抓取win2012明文密码

CS与MSF的权限互相传递抓取windows2012的明文密码 CS与MSF的权限互相传递 1、启动cs服务端 2、客户端连接 3、配置监听&#xff0c;并设置监听端口为9999 4、生成脚本 5、开启服务&#xff0c;下载并运行木马 已获取权限 6、进入msf并设置监听 7、cs新建监听&#xff0c;与m…

20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览

20240626让飞凌的OK3588-C开发板在相机使用1080p60分辨率下预览 2024/6/26 15:15 4.2.1 全编译测试 在源码路径内&#xff0c;提供了编译脚本 build.sh&#xff0c;运行该脚本对整个源码进行编译&#xff0c;需要在终端切换到解压 出来的源码路径&#xff0c;找到 build.sh 文件…

海纳斯 hinas 的hi3798mv100 华为悦盒 6108v9 安装wifi模块

hi3798mv100安装wifi模块 1.执行脚本 &#xff0c;执行完毕后重启服务器2. 继续执行脚本3.检查网卡驱动安装是否正确4.查看网卡安装状态5.连接wifi结尾 1.执行脚本 &#xff0c;执行完毕后重启服务器 bash <(curl -sSL https://gitee.com/xjxjin/scripts/raw/main/install_…

【LeetCode】三、队列相关:最近的请求次数

文章目录 1、队列结构2、leetcode933&#xff1a;最近的请求次数 1、队列结构 先进先出 时间复杂度&#xff1a; Java中&#xff0c;LinkedList集合可以当一个队列来用&#xff1a; 2、leetcode933&#xff1a;最近的请求次数 很逆天的题目描述&#xff0c;就是不同时间会有请…

关于WebSocket

WebSocket 与传统的 HTTP 协议对比 在实时通信领域&#xff0c;传统的 HTTP 协议存在以下一些问题&#xff1a; 频繁的请求和响应&#xff1a;每次通信都需要建立和关闭连接&#xff0c;带来额外的开销。高延迟&#xff1a;每次通信都需要经过多个网络层的传输&#xff0c;延…

【仿真】UR机器人手眼标定与实时视觉追踪(单目)

这段代码实现了一个机器人视觉引导系统,主要功能包括: 连接仿真环境,控制UR机器人。相机标定: 使用棋盘格图案进行相机内参标定通过移动机器人采集多组图像使用calibrateCamera函数计算相机内参 手眼标定: 采集机器人末端位姿和对应的棋盘格图像使用calibrateHandEye函数计算相…