牛客周赛 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 = 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.mfbz.cn/a/747408.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【第十八课】区域经济分析——探索性空间数据分析软件实操

一、前言 ArcGIS有专门处理探索性空间数据分析方法的工具,即地统计分析模块。 该模块主要由三个功能模块组成:探索性数据分析(Explore)、地统计分析向导(Geostatistical Wizard),以及生成数据子集(Create Subsets)。其中利用 这些基本功能模块,可以方便完成多种地统…

Thinkphp/Laravel高校竞赛管理系统的设计与实现_9pi7u

高校竞赛管理&#xff0c;其工作流程繁杂、多样、管理复杂与设备维护繁琐。而计算机已完全能够胜任高校竞赛管理工作&#xff0c;而且更加准确、方便、快捷、高效、清晰、透明&#xff0c;它完全可以克服以上所述的不足之处。这将给查询信息和管理带来很大的方便&#xff0c;从…

【Qt】Qt多线程编程指南:提升应用性能与用户体验

文章目录 前言1. Qt 多线程概述2. QThread 常用 API3. 使用线程4. 多线的使用场景5. 线程安全问题5.1. 加锁5.2. QReadWriteLocker、QReadLocker、QWriteLocker 6. 条件变量 与 信号量6.1. 条件变量6.2 信号量 总结 前言 在现代软件开发中&#xff0c;多线程编程已成为一个不可…

数字图像分析(第三部分)

文章目录 第11章 基于概率图模型的图像分析概率有向图模型因子分解生成式模型链式图条件独立性有向图模型的马尔科夫毯概率无向图模型模型定义概率无向图模型的因子分解条件随机场条件随机场的定义条件随机场的预测算法第12章 运动分析运动相机建模光流运动表达方法运动估计准则…

AI软件革新文本操作体验:从自动粘贴文本到一键提取保存手机号码

在当今数字化时代&#xff0c;AI技术的快速发展为各行各业带来了革命性的变革。特别是在文本处理领域&#xff0c;AI软件通过其强大的自动粘贴文本功能以及一键提取并保存手机号码的便捷操作&#xff0c;极大地提高了工作效率&#xff0c;为用户带来了全新的体验。本文将深入探…

CSS 文本输入框右下角的尺寸控件(三斜线:-webkit-resizer)消除,以及如何配置其样式,添加 resize 让标签元素可进行拖拽放大。

前言&#xff1a;在日常的前端开发中&#xff0c;不管是原始的和 还在在各类组件库中的文本输入框中&#xff0c;元素内容的右下角总是有一个三斜线的样式&#xff0c;本文简单了解它是什么&#xff1f;如何去控制并修改样式&#xff1f; 一、它是&#xff1f; 这三个斜线其实…

v0.9.6 开源跨平台个人知识管理工具 TidGi-Desktop

在这个信息爆炸的时代&#xff0c;知识管理变得尤为重要。太记(TidGi)&#xff0c;一款基于太微(TiddlyWiki)的知识管理桌面应用&#xff0c;正是为了满足人们对信息整理、知识管理和个人隐私保护的需求而设计的。它不仅能够帮助用户高效地管理和整理信息&#xff0c;还能够自动…

简化部署流程——无线UWB如何实现自标定?

一.什么是UWB信标自标定&#xff1f; UWB&#xff08;超宽带&#xff09;自标定是指在UWB系统中&#xff0c;基站或节点能够自动识别和确定自己的位置&#xff0c;无需外部干预或手动输入其地理位置信息。这种技术主要利用系统内部的信号测量和算法来自动计算节点之间的距离以…

使用PEFT库进行ChatGLM3-6B模型的LORA高效微调

PEFT库进行ChatGLM3-6B模型LORA高效微调 LORA微调ChatGLM3-6B模型安装相关库使用ChatGLM3-6B模型GPU显存占用准备数据集加载模型加载数据集数据处理数据集处理配置LoRA配置训练超参数开始训练保存LoRA模型模型推理从新加载合并模型使用微调后的模型 LORA微调ChatGLM3-6B模型 本…

【vue】vue响应式原理

vue响应式原理 vue2的响应式原理 vue2对对象类型的监听是通过Object.defineProperty实现的&#xff0c;给想要实现响应式的数据对象每个属性加上get,set方法&#xff0c;以实现数据劫持的操作。而对数组类型的监听是通过重写数组的方法实现的。 Object.defineProperty的定义…

组合数学、圆排列、离散数学多重集合笔记

自用 如果能帮到您&#xff0c;那也值得高兴 知识点 离散数学经典题目 多重集合组合 补充容斥原理公式 隔板法题目 全排列题目&#xff1a;

机械拆装-基于Unity-准备零件

目录 前言 1. 装配体模型的准备&#xff08;STEP格式保存为零件&#xff09; 1.1 关于不停提示“默认模板无效” 1.2 关于无法保存单个零件的解决 2. 整理装配体与零件 2.1 零件命名规则 2.2 建立子装配体 3. 装配体和零件转换格式 3.1 3DMax单位设置 3.2 装配体转换 3.3…

JavaScript通用下载方法,但jpg图片下载打不开

通用下载方法&#xff0c;通过Blob的方式&#xff0c;访问Url地址&#xff0c;下载对应的图片&#xff0c;excel等文件。 axios({method: "get",url,responseType: "blob",}).then((res: any) > {const link document.createElement("a");co…

Linux - 札记 - W10: Warning: Changing a readonly file

Linux - 札记 - W10: Warning: Changing a readonly file 这里写目录标题 一、问题描述1. 现象2. 原因 二、解决方案 一、问题描述 1. 现象 在使用 vim 编辑文件时&#xff08;我这里是要编辑 /root/.ssh/authorized_keys&#xff09;提示&#xff1a;W10: Warning: Changing…

VOC格式转YOLO格式,xml文件转txt文件简单通用代码

目录 前言 思路介绍 代码 完整代码 拓展代码 前言 很多人在进行目标检测训练时习惯将得到的数据标注为XML文件的VOC格式&#xff0c;或者在网上获取的数据集被标注为XML文件&#xff0c;但是不同的标注工具进行的标注会产生不同的标注xml文件&#xff0c;这里我写了一种通用…

信息学奥赛初赛天天练-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…

49、基于归一化感知器的输入向量分类(matlab)

1、基于归一化感知器的输入向量分类的原理及流程 归一化感知器是一种分类算法&#xff0c;其原理基于感知器算法&#xff0c;但是在输入向量上进行了归一化处理&#xff0c;以提高算法的性能和稳定性。 流程如下&#xff1a; 输入向量归一化&#xff1a;对每个输入向量进行归…

图解HTTP笔记整理(前六章)

图解HTTP 第一章 web使用HTTP &#xff08;HyperText Transfer Protocol&#xff0c;超文本传输协议&#xff09;协议作文规范&#xff0c;完成从客户端到服务器端等一系列运作流程。 协议&#xff1a;计算机与网络设备要相互通信&#xff0c;双方就必须基于相同的方法。比如…

JetBrains Rider 2024安装教程

一、下载Rider 1、进入官网&#xff0c;点击“下载” 2、下载完毕 二、安装Rider 1、双击下载的exe文件 2、点击“下一步” 3、可以点击“浏览”选择安装路径&#xff0c;之后点击“下一步” 4、选中图中四项&#xff0c;点击“下一步” 5、选中图中四项&#xff0c;点击“下…

Superset二次开发之导入导出功能源码解读

可导出的类型 支持 看板(Dashboard)、图表(Charts)、数据集(Datasets)、SQL(saved_query)、数据库(Database connection) 单次或批量的导出,和单次导入操作 看板(Dashboard) 图表(Charts) 数据集(Datasets) SQL (saved_query) 数据库(database connections)…