牛客周赛 Round 22 解题报告 | 珂学家 | 思维构造 + 最小生成树


前言

alt


整体评价

C题这个构造题挺好的,赛中把-1写成No, 直接整不会了,T_T.

D题是一道很裸的最小生成树题,只需要一个小小的逆向思维,把删除操作转换为构建过程。


欢迎关注

珂朵莉 牛客周赛专栏

珂朵莉 牛客小白月赛专栏


A. 小红的漂亮串

数据规模较小,直接暴力匹配即可,当然也可以使用API。

import java.io.BufferedInputStream;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));String s = sc.next();int cnt = 0;int pos = 0;while (cnt < 2 && (pos = s.indexOf("red", pos)) != -1) {pos += 3;cnt++;}System.out.println(cnt >= 2 ? "Yes": "No");}}
s = input()p = 0
cnt = 0
# find 和 index的区别
while cnt < 2 and s.find("red", p) != -1:cnt += 1p = s.find("red", p) + 1print ("Yes" if cnt >= 2 else "No")

B. 小红的偶子串

好像滑窗贪心是错误的

引入dp[i + 1], 表示以i结尾,且是偶数位的最长子串(为了处理方便,漂移了一位)

  • dp[i + 1] = dp[i - 1] + 2, str[i] == str[i - 1]

  • dp[i + 1] = 0, str[i] != str[i - 1]

import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));char[] str = sc.next().toCharArray();int n = str.length;int res = 0;int[] dp = new int[n + 1];for (int i = 1; i < n; i++) {if (str[i] == str[i - 1]) {dp[i + 1] = dp[i - 1] + 2;}res = Math.max(res, dp[i + 1]);}System.out.println(res);}}
s = input()n = len(s)
dp = [0] * (n + 1)dp[0] = 0
for i in range(0, n - 1):if s[i] == s[i + 1]:dp[i + 2] = max(dp[i + 2], dp[i] + 2)print (max(dp))

C. 小红的数组构造

首先可以排除掉不可能的情况

  • 1~n的累加和 > x
  • n > k

然后想如何构造这个神奇的数组呢?

可以先安排,1~n填充,即arr[i] = i

那这样还剩余

left = x - (n+1)*n/2

那如何处理这个剩余的部分呢?

其实可以对n进行乘除

  • d = left / n
  • r = left % n

把d赋值给每个元素,然后r这个尾巴相当于给最后的r个元素额外+1

这样的构造数组,应该是理想上最满足要求的数组了。


题外话:

赛中也采用了,类似后悔堆的思路,即先填充1~n,然后多余的从大到小进行置换,可以过,但是没法证明。

import java.io.BufferedInputStream;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int n = sc.nextInt();long k = sc.nextLong(), x = sc.nextLong();long s = ((long)n) * (n + 1) / 2;if (s > x || n > k) {System.out.println(-1);} else {long[] arr = new long[n + 1];for (int i = 1; i <= n; i++) {arr[i] = i;}x -= s;long d = x / n;long v = x % n;for (int i = 1; i <= n; i++) {arr[i] += d;if (n - i < v) {arr[i]++;}}// 对数组进行最后的check,保证每个元素都小于等于kboolean ok = true;for (int i = 1;i <= n; i++) {if (arr[i] > k) ok = false;}if (!ok) System.out.println("-1");else System.out.println(IntStream.range(1, n + 1).mapToObj(t -> String.valueOf(arr[t])).collect(Collectors.joining(" ")));}}}

D. 小红的图上删边

逆向思维,把删除转换为重头构建树,那这样就变成求最小生成树的过程了。

这边采用 kruskal算法,借助并查集来实现最小生成树的构建。

这边需要额外计算边权,其实就是统计每个点的2,5的因子数

w(u, v) = min(cnt5(u) + cnt5(v), cnt2(u) + cnt2(v))

整体的时间复杂度为 O ( m l o g m ) O(mlogm) O(mlogm), 主要在排序这块

import java.io.BufferedInputStream;
import java.util.*;public class Main {static class Dsu {int n;int[] arr;int[] gz;public Dsu(int n) {this.n = n;this.arr = new int[n + 1];this.gz = new int[n + 1];Arrays.fill(gz, 1);}int find(int u) {if (arr[u] == 0) return u;return arr[u] = find(arr[u]);}void union(int u, int v) {int ai = find(u), bi = find(v);if (ai != bi) {arr[ai] = bi;gz[bi] += gz[ai];}}int gSize(int u) {return gz[find(u)];}}public static void main(String[] args) {Scanner sc = new Scanner(new BufferedInputStream(System.in));int n = sc.nextInt(), m = sc.nextInt();Dsu dsu = new Dsu(n);long[] ws = new long[n + 1];int[] cnt5 = new int[n + 1];int[] cnt2 = new int[n + 1];for (int i = 1; i <= n; i++) {ws[i] = sc.nextLong();long v = ws[i];while (v % 5 == 0)  {cnt5[i]++;v /= 5;}while (v % 2 == 0)  {cnt2[i]++;v /= 2;}}long res = 0;List<int[]> edges = new ArrayList<>();for (int i = 0; i < m; i++) {int u = sc.nextInt(), v = sc.nextInt();int w = Math.min(cnt5[u] + cnt5[v], cnt2[u] + cnt2[v]);// 引入边权edges.add(new int[] {u, v, w});res += w;}// 按边权从小到大排序Collections.sort(edges, Comparator.comparing(x -> x[2]));long tmp = 0;for (int[] e: edges) {int u = e[0], v = e[1], w = e[2];if (dsu.find(u) != dsu.find(v)) {dsu.union(u, v);tmp += w;if (dsu.gSize(1) == n) {break;}}}// 删边收益 = 总的权值 - 最小生成树的权值System.out.println(res - tmp);}}
import heapqclass Dsu(object):def __init__(self, n: int):self.n = n self.arr = [0] * (n + 1) # index-1self.group = ndef find(self, u: int) -> int:if self.arr[u] == 0:return uself.arr[u] = self.find(self.arr[u])return self.arr[u]def union(self, u :int, v: int):a = self.find(u)b = self.find(v)if a != b:self.arr[a] = bself.group -= 1def groupNum(self) -> int:return self.groupn, m = list(map(int, input().split()))
arr = list(map(int, input().split())) # 逆向思维
cnt2 = [0] * (n + 1)
cnt5 = [0] * (n + 1)for i in range(len(arr)):v = arr[i]while v % 2 == 0:v /= 2cnt2[i + 1] += 1while v % 5 == 0:v /= 5cnt5[i + 1] += 1res = 0
edges = []
for i in range(m):u, v = list(map(int, input().split()))edges.append((min(cnt2[u] + cnt2[v], cnt5[u] + cnt5[v]), u, v))res += min(cnt2[u] + cnt2[v], cnt5[u] + cnt5[v])dsu = Dsu(n)
heapq.heapify(edges)while dsu.groupNum() > 1 and len(edges):row = heapq.heappop(edges)if dsu.find(row[1]) != dsu.find(row[2]):dsu.union(row[1], row[2])res -= row[0]print (res)

写在最后

alt

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

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

相关文章

【51单片机系列】DS18B20温度传感器模块

本文是关于温度传感器的相关内容。 文章目录 一、 DS18B20数字温度传感器介绍1.1、 DS18B20温度传感器的特点1.2、DA18B20内部结构1.3、 DS18B20的温度转换规则1.4、 DS18B20的ROM指令表1.6、 计算温度1.7、 读写时序 二、DS18B20使用示例 一、 DS18B20数字温度传感器介绍 DS1…

2024年科技盛宴“上海智博会·上海软博会”招商工作接近尾声

2024年上海智博会和上海软博会即将于3月份在上海跨国采购会展中心盛大召开。作为全球科技和软件行业的盛会&#xff0c;这两大展会汇集了业界顶尖的企业、创新技术和前瞻思想&#xff0c;吸引了来自世界各地的专业人士和参展商。 今年的展会将一如既往地为大家呈现最前沿的科技…

MAC鼠标中键的使用

MAC鼠标没有鼠标中键&#xff0c;于是在一些场景中用起来非常麻烦&#xff0c;这里介绍几种键盘快捷键鼠标左键实现中键功能的例子&#xff1a; 1&#xff09;在sublime text 或者pycharm等一些文本编辑器或IDE中实现中键修改一列数据中特定位置的值 FNOPT左键另外还有C4D&…

C# 学习网站

C# 文档 - 入门、教程、参考。 | Microsoft Learnhttps://learn.microsoft.com/zh-cn/dotnet/csharp/ Browse code samples | Microsoft LearnGet started with Microsoft developer tools and technologies. Explore our samples and discover the things you can build. htt…

真心建议,入职业务部门前先学会BI数据分析

不管进入哪个业务部门&#xff0c;都需要具备一定的数据分析能力&#xff0c;能够从不断累积的数据中发现并解决问题。比如销售部门的需要通过分析销售数据&#xff0c;及时发现销售不佳的商品&#xff0c;调整销售策略&#xff0c;提高销售额、销售利润等。而随着精细化数据分…

分布式核心技术之分布式事务

文章目录 什么是分布式事务&#xff1f;如何实现分布式事务&#xff1f;基于 XA 协议的二阶段提交方法三阶段提交方法基于分布式消息的最终一致性方案BASE 理论 三种实现方式对比 什么是分布式事务&#xff1f; 事务&#xff0c;其实是包含一系列操作的、一个有边界的工作序列…

Transformer图解

Transformer正在席卷自然语言处理领域。 这些令人难以置信的模型正在打破多项 NLP 记录并推动最先进的技术发展。 它们被用于许多应用程序&#xff0c;如机器语言翻译、会话聊天机器人&#xff0c;甚至为更好的搜索引擎提供动力。 Transformer在当今深度学习领域风靡一时&…

Anylogic Pro 8.8.x for Mac / for Linux Crack

Digital twins – a step towards a digital enterprise AnyLogic是唯一一个支持创建模拟模型的方法的模拟建模工具&#xff1a;面向过程&#xff08;离散事件&#xff09;、系统动态和代理&#xff0c;以及它们的任何组合。AnyLogic提供的建模语言的独特性、灵活性和强大性使…

北亚服务器数据恢复-服务器断电导致raid5故障的数据恢复案例

服务器数据恢复环境&#xff1a; 服务器有一组由12块硬盘组建的raid5阵列。 服务器故障&分析&#xff1a; 机房供电不稳导致服务器意外断电&#xff0c;工作人员重启服务器后发现服务器无法正常使用。 根据故障情况&#xff0c;北亚企安数据恢复工程师初步判断服务器故障原…

目标检测-Two Stage-RCNN

文章目录 前言一、R-CNN的网络结构及步骤二、RCNN的创新点候选区域法特征提取-CNN网络 总结 前言 在前文&#xff1a;目标检测之序章-类别、必读论文和算法对比&#xff08;实时更新&#xff09;已经提到传统的目标检测算法的基本流程&#xff1a; 图像预处理 > 寻找候选区…

毕业首选 | CCF推荐1区SCI,IF:6.0,Elsevier出版社,最快仅1个月Accept!

【SciencePub学术】本期&#xff0c;小编给大家解析的是一本Elsevier旗下、CCF-C类、影响因子为6.0的中科院3区SCI。其详情如下&#xff1a; 期刊简介 COMPUTER COMMUNICATIONS ISSN&#xff1a;0140-3664 E-ISSN&#xff1a;1873-703X IF&#xff08;2022&#xff09;&a…

SQL server 数据库练习题及答案(练习3)

一、编程题 公司部门表 department 字段名称 数据类型 约束等 字段描述 id int 主键&#xff0c;自增 部门ID name varchar(32) 非空&#xff0c;唯一 部门名称 description varchar(1024) …