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

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

简单题 藻类植物

每年的递推公式就是 x = r*x - d,通过循环计算 2025-2034 年的藻类植物总重

package main

import "fmt"

func main() {
	var r, d, x int
	fmt.Scan(&r, &d, &x)
	for i := 0; i < 10; i++ {
		x = r*x - d
		fmt.Println(x)
	}
}

中等题 小红的蛋糕切割

  1. 计算二维前缀和数组 s。
  2. 枚举所有可能的正方形子矩阵,计算其美味度和 s1。
  3. 使用总美味度和减去 s1 得到 s2。
  4. 计算两者的差值绝对值,并更新最小值。
package main

import (
	"bufio"
	"fmt"
	"math"
	"os"
)

func abs(x int) int {
	if x < 0 {
		return -x
	}
	return x
}

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

	var n, m int
	fmt.Fscan(in, &n, &m)
	a := make([][]int, n+1)
	s := make([][]int, n+1)
	for i := 0; i <= n; i++ {
		a[i] = make([]int, m+1)
		s[i] = make([]int, m+1)
	}
	for i := 1; i <= n; i++ {
		for j := 1; j <= m; j++ {
			fmt.Fscan(in, &a[i][j])
			s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]
		}
	}
	total := s[n][m]
	minDiff := math.MaxInt

	for i := 1; i <= n; i++ {
		for j := 1; j <= m; j++ {
			for size := 1; i+size-1 <= n && j+size-1 <= m; size++ {
				x1, y1 := i, j
				x2, y2 := i+size-1, j+size-1
				s1 := s[x2][y2] - s[x1-1][y2] - s[x2][y1-1] + s[x1-1][y1-1]
				s2 := total - s1
				diff := abs(s1 - s2)
				if diff < minDiff {
					minDiff = diff
				}
			}
		}
	}

	fmt.Fprintln(out, minDiff)
}

困难题 【模板】整数域三分

算法思路

  • 由于表达式 |kix + ai| + bi 是一个凸函数,它们的和也是凸函数
  • 对于凸函数求最小值,可以使用三分法来解决
  • 三分法的原理是通过将区间分成三份,比较两个三分点的函数值来缩小搜索范围

关键函数实现

  • check(x):计算给定 x 值时所有表达式的总和
  • threeDivide(left, right):三分法实现,在区间内寻找最小值
    • 当区间长度大于 3 时,持续缩小搜索范围
    • 最后对剩余的小区间进行暴力搜索以确保精确性
package main

import (
	"bufio"
	"fmt"
	"os"
)

var (
	in  *bufio.Reader
	out *bufio.Writer
)

var (
	n       int
	k, a, b []int64
)

func abs(x int64) int64 {
	if x < 0 {
		return -x
	}
	return x
}

func min(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}

func check(x int64) int64 {
	var ans int64
	for i := 0; i < n; i++ {
		ans += abs(k[i]*x+a[i]) + b[i]
	}
	return ans
}

func threeDivide(left, right int64) int64 {
	for right-left > 3 {
		mid1 := left + (right-left)/3
		mid2 := right - (right-left)/3
		if check(mid1) > check(mid2) {
			left = mid1
		} else {
			right = mid2
		}
	}
	res := check(left)
	for i := left + 1; i <= right; i++ {
		res = min(res, check(i))
	}
	return res
}

func solve() {
	var l, r int64
	fmt.Fscan(in, &n, &l, &r)
	k = make([]int64, n)
	a = make([]int64, n)
	b = make([]int64, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &k[i], &a[i], &b[i])
	}
	fmt.Println(threeDivide(l, r))
}

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

	var t int
	fmt.Fscan(in, &t)
	for i := 0; i < t; i++ {
		solve()
	}
}

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

爱丽姐真是太好了

全部评论

相关推荐

点赞 评论 收藏
分享
05-24 09:55
已编辑
上海大学 Java
更新:一面过了,但通勤有点远,接了另一个小厂的offer鼠鼠二本,现在大二,项目是苍穹和仿Git,问得还是挺简单的,不过还是有几个没答好公司规模算是中小厂,100-499那个档的,做的业务应该是快消的产业链、信息化这一块一面是线上,如果通过,二面是要线下去的。公司里学校挺远的,地铁要一个半小时,各位牛爷爷给点意见1.&nbsp;自我介绍2.&nbsp;从哪里学的CS61B(自我介绍中提到的)3.&nbsp;学校里学过的专业课中哪门课印象最深刻/收获最多4.&nbsp;第一个项目就是java程序设计的课程项目吗5.&nbsp;学习java多久了6.&nbsp;java中常见的规范7.&nbsp;讲讲Restful规范——没答出来8.&nbsp;数据库用的什么9.&nbsp;了解哪些java集合,讲讲它们的原理(LinkedList、ArrayList)10.&nbsp;Hashmap线程安全吗?哪个是线程安全的?介绍一下原理(Hashmap、ConcurrentHashmap)11.&nbsp;说说mysql优化12.&nbsp;说说逻辑外键13.&nbsp;说说mysql的索引优化——没答出来14.&nbsp;看到你的第二个项目是与git相关的,那么你来说说我们常用的git命令吧15.&nbsp;数据结构和算法掌握得怎么样16.&nbsp;口头手撕:非严格单调递增数列如何去重?17.&nbsp;看你简历上说对前端有一定了解,那就是对前端三件套和vue了解并可以进行开发吗18.&nbsp;挑一个项目给我简要介绍一下19.&nbsp;项目中遇到的难点20.&nbsp;bitmap操作的时间复杂度——没答出来21.&nbsp;常见的排序算法,它们的时间复杂度22.&nbsp;讲一讲快速排序的具体实现——没答出来23.&nbsp;看到你项目中第一点写到JWT令牌完成登录,Threadlocal储存用户信息,能讲讲吗24.&nbsp;ThreadLocal是弱引用,那么相比于强引用,弱引用的优势是什么——没答出来25.&nbsp;实习时长26.&nbsp;学校在哪27.&nbsp;未来的职业规划28.&nbsp;反问&nbsp;
查看27道真题和解析
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务