牛客春招刷题训练营-2025.5.26题解

活动地址: 牛客春招刷题训练营 - 编程打卡活动

简单题 小红的矩阵

  • 使用两层循环遍历 n × m 的矩阵
  • 通过 a%10 == 9 判断一个数字的个位是否为 9
  • 使用 cnt 变量记录满足条件的数字个数
package main

import "fmt"

func main() {
	var n, m int
	fmt.Scan(&n, &m)
	cnt := 0
	for i := 0; i < n; i++ {
		for j := 0; j < m; j++ {
			var a int
			fmt.Scan(&a)
			if a%10 == 9 {
				cnt++
			}
		}
	}
	fmt.Println(cnt)
}

中等题 游游的最小公倍数

  1. 最小公倍数的性质
    • 最小公倍数 lcm(a, b) 和最大公约数 gcd(a, b) 的关系是:
    • 因此,为了让 lcm(a, b) 尽可能大,我们需要让 gcd(a, b) 尽可能小。理想情况下,gcd(a, b) = 1(即 a 和 b 互质)。
  2. 分解 n
    • 我们需要将 n 分解为 a + b = n,其中
    • 初始可以令 ,这样可以让 a 和 b) 尽量接近。
  3. 调整 a 和 b
    • 如果 gcd(a, b) > 1,则说明 a 和 b 不互质,此时需要调整 a 和 b 的值。
    • 调整的方式是逐步减小 a 并增大 b,直到 gcd(a, b) = 1。
package main

import "fmt"

func gcd(a, b int64) int64 {
	if b == 0 {
		return a
	}
	return gcd(b, a%b)
}

func main() {
	var t int
	fmt.Scan(&t)
	for i := 0; i < t; i++ {
		var n int64
		fmt.Scan(&n)
		a, b := n/2, n-n/2
		for gcd(a, b) != 1 {
			a--
			b++
		}
		fmt.Println(a, b)
	}
}

困难题 【模板】单源最短路Ⅰ ‖ 无权图

  1. 输入处理
    • 读取图的顶点数 n、边数 m 和起点 s。
    • 构建图的邻接表表示。每条边用一个结构体 Edge 表示,包含目标顶点 to 和边的权重 cost
  2. 初始化
    • 使用数组 dis 存储从起点 s 到每个顶点的最短距离,初始时将起点的距离设为0,其余顶点的距离设为无穷大(即 INF)。
    • 使用布尔数组 vis 标记顶点是否已被访问过,初始时所有顶点都未被访问。
  3. Dijkstra算法
    • 使用优先队列(最小堆)来选择当前距离起点最近的未访问顶点。
    • 每次从优先队列中取出距离最小的顶点 v,如果该顶点已经被访问过,则跳过;否则标记为已访问。
    • 遍历顶点 v 的所有邻接边,更新相邻顶点的最短距离。如果发现更短的路径,则更新距离并将该顶点加入优先队列。
  4. 输出结果
    • 遍历所有顶点,输出从起点 s 到每个顶点的最短路径长度。如果某个顶点不可达(即距离仍为 INF),则输出 -1
package main

import (
	"bufio"
	"container/heap"
	"fmt"
	"os"
)

type Edge struct {
	to, cost int
}

const N = 2000010
const INF int = 1e9

var (
	g       [N][]Edge
	dis     [N]int
	vis     [N]bool
	n, m, s int
)

func initGraph() {
	for i := 1; i <= n; i++ {
		if i == s {
			dis[i] = 0
		} else {
			dis[i] = INF
		}
	}
}

type PII struct {
	first, second int
}

type PriorityQueue []PII

func (pq PriorityQueue) Len() int           { return len(pq) }
func (pq PriorityQueue) Less(i, j int) bool { return pq[i].first < pq[j].first }
func (pq PriorityQueue) Swap(i, j int)      { pq[i], pq[j] = pq[j], pq[i] }

func (pq *PriorityQueue) Push(x interface{}) {
	*pq = append(*pq, x.(PII))
}

func (pq *PriorityQueue) Pop() interface{} {
	old := *pq
	n := len(old)
	item := old[n-1]
	*pq = old[0 : n-1]
	return item
}

func Dijkstra() {
	initGraph()
	pq := &PriorityQueue{}
	heap.Init(pq)
	heap.Push(pq, PII{0, s})

	for pq.Len() > 0 {
		t := heap.Pop(pq).(PII)
		v := t.second

		if vis[v] {
			continue
		}
		vis[v] = true

		for _, e := range g[v] {
			if dis[e.to] > dis[v]+e.cost {
				dis[e.to] = dis[v] + e.cost
				heap.Push(pq, PII{dis[e.to], e.to})
			}
		}
	}
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	fmt.Fscan(in, &n, &m, &s)

	for i := 0; i < m; i++ {
		var u, v int
		fmt.Fscan(in, &u, &v)
		g[u] = append(g[u], Edge{to: v, cost: 1})
	}

	Dijkstra()

	for i := 1; i <= n; i++ {
		if dis[i] == INF {
			fmt.Fprint(out, "-1 ")
		} else {
			fmt.Fprint(out, dis[i], " ")
		}
	}
}

#牛客春招刷题训练营#
牛客春招刷题训练营 文章被收录于专栏

爱丽姐真是太好了

全部评论
点赞 回复 分享
发布于 05-29 11:31 安徽
好厉害
点赞 回复 分享
发布于 05-29 11:31 广西
mark
点赞 回复 分享
发布于 05-29 11:31 陕西
mark
点赞 回复 分享
发布于 05-29 11:31 四川
mark
点赞 回复 分享
发布于 05-29 11:31 北京
mark
点赞 回复 分享
发布于 05-29 11:31 天津
mark
点赞 回复 分享
发布于 05-29 11:31 四川

相关推荐

首先&nbsp;我觉得最重要的其实就是方向不清晰。第一次面试是在大二的秋招,当时能力一般,但是胆子很大,直接去面了当时仅有的几个小巨人企业(学校蛮偏的,没大厂几乎),然后就清晰了很多。大概了解了不同岗位需要的不同技能,以及如何提升竞争力除了竞赛,项目,实习。还可以尝试扩展自己的技术栈,例如嵌入式可以结合Android,嵌入式也需要有一定的原理图理解能力,接触到了lvgl,rtos这些概念。找到方向之后就是努力,就是不知道怎么努力。打比赛发现在硬件实验室里面的软件没什么发挥的机会,基本都是裸机开发,没有系统。软件也比较多的就是做个深度学习,视觉处理。实在是电子信息的佬太强了,电机调节啥的都包了,所以一直找不到提升的好方法。后来下定决心自己做项目,从比较熟悉的上位机qt开始做,然后是树莓派网关,云服务器linux的应用层基础,第一次画板,第一次尝试设计协议,第一次做app…终于发现,比赛其实不需要多,更重点是自己能力的提升。如果能力不够,没必要空焦虑,要把焦虑的情绪指向可以控制的事情上,而不是去想能否就业,能否高薪这种控制不了的事情上。现在来说,其实个人能力不是很强,只能边学边做了。大厂对于我们双非或许就像是月亮吧,总有人能登月,但是更多的只能仰望。唯有一步一步踏实的搭好自己的火箭,才有机会一睹芳容。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务