牛客周赛 Round 34 解题报告 | 珂学家 | 构造思维 + 置换环

news2025/1/18 17:03:55

前言


整体评价

好绝望的牛客周赛,彻底暴露了CF菜菜的本质,F题没思路,G题用置换环骗了50%, 这大概是唯一的亮点了。


A. 小红的字符串生成

思路: 枚举

a,b两字符在相等情况下比较特殊

a, b = input().split()
if a == b:
    print (2)
    print (a)
    print (a + a)
else:
    print (4)
    print (a)
    print (b)
    print (a + b)
    print (b + a)

B. 小红的非排列构造

思路: 脑筋急转弯

如果合法,就是0

如果不合法,就把第1项改为n+1(排列外的数)

n = int(input())
arr = list(map(int, input().split()))

si = set()
for v in arr:
    if 1 <= v <= n:
        si.add(v)
if len(si) != n:
    print (0)
else:
    print (1)
    print (1, n + 1)

C. 小红的数字拆解

思路: 贪心

从高位到低位贪心即可

s = input()

arr = []

i = 0
while i < len(s):
    j = i
    while j < len(s):
        p = ord(s[j]) - ord('0')
        if p % 2 == 0:
            break
        j += 1
    arr.append(s[i:j+1])
    i = j + 1

arr.sort(key=lambda x: (len(x), x))

print (*arr, sep='\n')

D. 小红的陡峭值

思路: 构造

这题是限制性很强的题, 绝对差值总和为1

对于不满足条件数组,可以立马返回 -1.

难点在于

如何构造合法数组 如何构造合法数组 如何构造合法数组

假定0元素(左右两侧都存在非0值),和左侧元素保持一致(反证法使得该假设一定成立)

那就剩下一侧有非0值的0值,如何讨论呢?

  • 如果绝对差值总和为1
    • 那就和左侧/右侧的那个非0值,保持一致
  • 如果绝对差值总和为0
    • 那就选一边构造一个比左侧/右侧刚好大1的数
n = int(input())
arr = list(map(int, input().split()))

if arr == [0 for _ in range(n)]:
    if len(arr) == 1:
        print (-1)
    else:
        print (*([1] + [2] * (n - 1)), sep=' ')
else:
    # 计算当前的差值综合
    brr = [v for v in arr if v > 0]
    diff = 0
    for i in range(len(brr) - 1):
        diff += abs(brr[i] - brr[i+1])

    if diff > 1:
        print (-1)
    else:
        first, last = -1, -1
        for i in range(n):
            if arr[i] != 0:
                if first == -1:
                    first = i
                last = i 

        # 填充中间的值
        pre = arr[first]
        for i in range(first + 1, last):
            if arr[i] == 0:
                arr[i] = pre
            else:
                pre = arr[i]

        # 填充两端的值
        if diff == 1:
            # 需要两端保持绝对值差值为0
            for i in range(first):
                arr[i] = arr[first]
            for i in range(last + 1, n):
                arr[i] = arr[last]
            print (*arr, sep=' ')
        else:
            # 需要两端构建出一个绝对值差值1
            if first > 0:
                for i in range(first):
                    arr[i] = arr[first] + 1
                for i in range(last + 1, n):
                    arr[i] = arr[last]
                print (*arr, sep=' ')
            elif last + 1 < n:
                for i in range(last + 1, n):
                    arr[i] = arr[last] + 1
                print (*arr, sep=' ')
            else:
                print (-1)

E. 小红的树形 dp

思路: BFS + 验证

属于诈骗题,因为题目一直再诱导你往树形DP上去靠

其实从bfs出发,进行交叉染色

然后对边上两点进行验证,如果存在同色,即不合法

n = int(input())
s = input()
ss = list(s)

g = [[] for _ in range(n)]

for _ in range(n - 1):
    u, v = list(map(int, input().split()))
    u -= 1
    v -= 1
    g[u].append(v)
    g[v].append(u)

from collections import deque

deq = deque()
for i in range(n):
    if ss[i] != '?':
        deq.append((i, ss[i]))
        
# 需要补充这种特殊情况
if len(deq) == 0:
    ss[0] = 'd'
    deq.append((0, ss[0]))

# BFS流程
while len(deq) > 0:
    idx, ch = deq.popleft()
    for v in g[idx]:
        if ss[v] == '?':
            ss[v] = 'd' if ch == 'p' else 'p'
            deq.append((v, ss[v]))

# 验证逻辑
ok = True
for i in range(n):
    ch = ss[i]
    if ch == '?':
        ok = False
        break
    for v in g[i]:
        if ch == 'd' and ss[v] != 'p':
            ok = False
            break
        if ch == 'p' and ss[v] != 'd':
            ok = False
            break

if not ok:
    print (-1)
else:
    print (''.join(ss))

F. 小红的矩阵构造

思路: 异或特性

贴一下皮神的代码

代码即是说服力

n, m, x = map(int, input().split())
 
res = [[0] * m for _ in range(n)]
 
if x % 4 == 0:
    res[0][0] = res[0][1] = res[1][0] = res[1][1] = x // 4
    for ls in res:
        print(*ls)
elif x == 2:
    print(-1)
else:
    res[2][0] = res[2][1] = 1
    res[1][0] = res[1][2] = 1
    res[0][1] = res[0][2] = 1
    for i in [0, -1]:
        for j in [0, -1]:
            res[i][j] += (x - 6) // 4
    for ls in res:
        print(*ls)

G. 小红的元素交换

思路: 置换环 + 找规律

假如这题没有交换颜色的限制,那这题就是裸的置换环

但是实际上,这题的核心框架依旧是

置换环 置换环 置换环

具体情况需要分类讨论

  • 同一置换环(a个元素)中存在两种颜色, 则交换一定为a-1

  • 同一置换环(a个元素)中只存在1种颜色, 则需要借助外部的非同色,这样为a-1+2=a+1

但是这样做,只能对大致50%+

为啥呢?

因为对于纯色R的置换环,和纯色W的置换环,其实可以互相借调,因此这一组合,可以减少2次不必要的交换。

因此在原先的基础上,需要优化减掉

m i n ( 纯色 R 的群数,纯色 W 的群数 ) ∗ 2 min(纯色R的群数,纯色W的群数) * 2 min(纯色R的群数,纯色W的群数)2

n = int(input())
arr = list(map(int, input().split()))
s = input()

from collections import Counter

if [i + 1 for i in range(n)] != arr and len(Counter(s)) == 1:
    print(-1)
else:
    res = 0
    white, red = 0, 0
    for i in range(n):
        if arr[i] == i + 1:
            continue
        else:
            # 置换环核心逻辑
            state = 0
            tmp = 0
            while arr[i] != i + 1:
                p1, p2 = i, arr[i] - 1
                arr[p1], arr[p2] = arr[p2], arr[p1]
                tmp += 1
                state |= 2 if s[p1] == 'R' else 1
                state |= 2 if s[p2] == 'R' else 1
                
            # 分类讨论置换环的纯色情况
            if state == 3:
                res += tmp
            else:
                # 纯色,需要借调外部力量
                res += tmp + 2
                if state == 1:
                    white += 1
                else:
                    red += 1

    print(res - min(white, red) * 2)

写在最后

alt

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

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

相关文章

【Redis】搞懂过期删除策略和内存淘汰策略

1、过期删除策略 1.1、介绍 Redis 是可以对 key 设置过期时间的&#xff0c;因此需要有相应的机制将已过期的键值对删除&#xff0c;而做这个工作的就是过期键值删除策略。 每当我们对一个 key 设置了过期时间时&#xff0c;Redis 会把该 key 带上过期时间存储到一个过期字典…

3.openEuler物理存储及逻辑卷管理(一):磁盘存储挂载与使用

openEuler OECA认证辅导,标红的文字为学习重点和考点。 如果需要做实验,建议下载麒麟信安、银河麒麟、统信等具有图形化的操作系统,其安装与openeuler基本一致。 磁盘大类: HDD, (Hard Disk Drive的缩写) : 由一个或者多个铝制或者玻璃制成的磁性碟 片,磁头,…

流计算之Flink

文章目录 概要有界无界流集群JobManagerTaskManagersTasks 和算子链Task Slots 和资源 小结 概要 Apache Flink 是一个框架和分布式处理引擎&#xff0c;用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行&#xff0c;并能以内存速度和任意规模…

深度解析:Integer.parseInt() 源码解读

深度解析&#xff1a;Integer.parseInt() 源码解读 关键要点 解析字符&#xff1a;用于将字符转换为对应的数字值 Character.digit(s.charAt(i),radix) 确定limit&#xff1a;根据正负号分别设定 int limit -Integer.MAX_VALUE;【正】 limit Integer.MIN_VALUE;【负】 负数…

通过几天JAVA学习总结和查询资料编写一个学生管理系统(简单版)

目录 需求分析 需求&#xff1a; 分析&#xff1a; 学生管理系统开始菜单界面 学生类&#xff1a; 功能实现&#xff1a; 添加功能 删除功能 修改功能 查询功能 项目实现 项目实现分析&#xff1a; 1.实现菜单选择功能 2.实现添加学生信息功能 3.实现删除学生信…

【DAY04 软考中级备考笔记】数据结构基本结构和算法

数据结构基本结构和算法 2月25日 – 天气&#xff1a;晴 周六玩了一天&#xff0c;周天学习。 1. 什么是数据结构 数据结构研究的内容是一下两点&#xff1a; 如何使用程序代码把现实世界的问题信息化如何用计算机高效地处理这些信息从创造价值 2. 什么是数据 数据是信息的…

Pod 异常问题排查

文章目录 前言1、诊断流程2、常用的排查方法3、Pod 状态、原因分析及故障处理总结 前言 通过 Kubernetes 部署服务&#xff0c;服务并未按照计划正常提供服务。如何通过 Pod 状态&#xff0c;进行异常问题的定制就显得特别重要了&#xff01; 1、诊断流程 2、常用的排查方法 …

基于ZYNQ的PCIE高速数据采集卡的设计(一)

作为信息处理的第一步&#xff0c;数据采集的作用越来越重要。目前&#xff0c;数据采集已经在航 空、民用、军事、医疗等领域得到广泛应用。随着相关技术的不断发展&#xff0c;信号频率越 来高&#xff0c;带宽越来越大&#xff0c;使得数据采集技术逐渐向高速大数据的方向…

最新计算机毕业设计题目100例

文章目录 0 前言1 计算机毕设选题推荐2 开题指导3 最后 0 前言 大家好&#xff01;大四的同学们毕业设计即将开始了&#xff0c;你们做好准备了吗&#xff1f; 学长给大家精心整理了最新的计算机毕业设计选题&#xff0c;希望能为你们提供帮助。如果在选题过程中有任何疑问&a…

C++之std::tuple(二) : 揭秘底层实现原理

相关系列文章 C之std::tuple(二) : 揭秘底层实现原理 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 深入理解可变参数(va_list、std::initializer_list和可变参数模版) st…

创作纪念日:记录我的成长与收获

机缘 一开始是在我深入学习前端知识的Vue.js框架遇到了一个问题&#xff0c;怎么都解决不了&#xff0c;心烦意乱地来csdn上找解决方法。开心的是真被我找到了&#xff0c;真的很感恩&#xff0c;也意识到在这个平台上分享自己的经验是多么有意义的事情&#xff0c;可能随便的…

外包干了3个月,技术倒退明显...

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

在使用nginx的时候快速测试配置文件,并重新启动

小技巧 Nginx修改配置文件后需要重新启动&#xff0c;常规操作是启动在任务管理器中关闭程序然后再次双击nginx.exe启动&#xff0c;但是使用命令行就可以快速的完成操作。 将cmd路径切换到nginx的安装路径 修改完成配置文件后 使用 nginx -t校验nginx 的配置文件是否出错 …

相机选型介绍

摄影测量中&#xff0c;相机是非常重要的角色&#xff0c;合适的相机产出合适的图像&#xff0c;得到合适的重建精度&#xff0c;这是相机的重要性。 您也许第一反应是&#xff0c;摄影测量所需的理想相机&#xff0c;是有着超高分辨率的相机&#xff0c;但事实可能并非如此&a…

HTML+CSS+JS:轮播组件

效果演示 一个具有动画效果的卡片元素和一个注册表单,背景为渐变色,整体布局简洁美观。 Code <div class="card" style="--d:-1;"><div class="content"><div class="img"><img src="./img/果果k_01.jpg…

【全网首发】上周申请的谷歌Gemini 1.5 Pro已通过!百万token的Gemini 1.5 Pro开箱测试(一)

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

【接口加密】接口加密的未来发展与应用场景

目录 3.1 接口加密与区块链技术的结合 3.1.1 区块链技术的安全特性与优势 3.1.2 接口加密在区块链中的应用案例 3.2 接口加密与物联网安全 3.2.1 物联网安全的挑战与需求 3.2.2 接口加密在物联网领域的实际应用 3.3 接口加密在金融与电子商务领域的应用 随着信息技术的不…

【初始RabbitMQ】延迟队列的实现

延迟队列概念 延迟队列中的元素是希望在指定时间到了之后或之前取出和处理消息&#xff0c;并且队列内部是有序的。简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列 延迟队列使用场景 延迟队列经常使用的场景有以下几点&#xff1a; 订单在十分…

Spring Boot 笔记 025 主界面

1.1 路由搭建 1.1.1 安装vue router npm install vue-router4 1.1.2 在src/router/index.js中创建路由器&#xff0c;并导出 import { createRouter, createWebHistory } from vue-router//导入组件 import LoginVue from /views/Login.vue import LayoutVue from /views/La…

设计模式学习笔记 - 面向对象 - 8.实践:贫血模型和充血模型的原理及实践

1.Web开发常用的贫血MVC架构违背OOP吗&#xff1f; 前面我们依据讲过了面向对象四大特性、接口和抽象类、面向对象和面向过程编程风格&#xff0c;基于接口而非实现编程和多用组合少用继承设计思想。接下来&#xff0c;通过实战来学习如何将这些理论应用到实际的开发中。 大部…