2024-01-06:用go语言,在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧

在桥上有一些石子,青蛙很讨厌踩在这些石子上

由于桥的长度和青蛙一次跳过的距离都是正整数

我们可以把独木桥上青蛙可能到达的点看成数轴上的一串整点:0...L

其中L是桥的长度,坐标为 0 的点表示桥的起点,坐标为 L 的点表示桥的终点

青蛙从桥的起点开始,不停的向终点方向跳跃

一次跳跃的距离是 S 到 T 之间的任意正整数(包括S,T)

当青蛙跳到或跳过坐标为 L 的点时,就算青蛙已经跳出了独木桥。

题目给出独木桥的长度 L,青蛙跳跃的距离范围[S,T],

以及桥上石子的位置。

你的任务是确定青蛙要想过河,最少需要踩到的石子数。

来自华为社招笔试。

答案2024-01-06:

来自左程云

灵捷3.5

大体步骤如下:

1.读入桥的长度 L、跳跃的最小距离 S、最大距离 T 和石子的位置数组。

2.如果起点和终点相同,即 S 等于 T,则遍历石子数组,计算能够整除 S 的石子数量,并输出结果。

3.否则,将石子位置数组排序,并计算可以减少的最小跳跃距离 cut,该值等于 S 和 T 之间的最小值。

4.初始化距离数组 distance,并将最小距离初始值设为 0。同时设置一个 stone 数组,记录可能存在石子的位置。

5.遍历石子位置数组,计算每个石子之间的距离,并将距离标记在 distance 数组中,同时在 stone 数组中将对应位置设为 true。

6.更新桥的长度为 distance 数组中的最后一个数和 cut 的较小值。

7.初始化 dp 数组,长度为桥的长度加一,并将每个位置的初始值设为 MAXN。

8.动态规划求解 dp 数组,计算最少需要踩到的石子数。

  • 对于每个位置 i,从 i-s 到 i-t 之间的位置 j,取 dp[j] 的最小值,再加上是否有石子的判断 boolToInt(stone[i])。

9.遍历 distance 数组的最后一个数加一到桥的长度 l,取 dp 数组中的最小值,即为最少需要踩到的石子数。

10.输出结果。

总的时间复杂度是 O(m log m + l * t),其中 m 是石子数量,l 是桥的长度,t 是最大跳跃距离;

总的额外空间复杂度是 O(l + t)。

go完整代码如下:

package main

import (
"fmt"
"sort"
) const (
MAXN = 101
MAXL = 100001
MAXK = 201
) var (
arr [MAXN]int
distance [MAXN]int
dp [MAXL]int
stone [MAXL]bool
reach [MAXK]bool
l, s, t, m, cut int
) func main() {
inputs := []int{10,
2, 3, 5,
2, 3, 5, 6, 7}
ii := 0
l = inputs[ii]
ii++
s = inputs[ii]
ii++
t = inputs[ii]
ii++
m = inputs[ii]
ii++ for i := 1; i <= m; i++ {
arr[i] = inputs[ii]
ii++
}
if s == t {
ans := 0
for i := 1; i <= min(l, m); i++ {
if arr[i]%s == 0 {
ans++
}
}
fmt.Println(ans)
} else {
sort.Ints(arr[1 : m+1])
cut = reduce(s, t)
for i := 1; i <= m; i++ {
distance[i] = distance[i-1] + min(arr[i]-arr[i-1], cut)
stone[distance[i]] = true
}
l = min(l, distance[m]+cut)
for i := 1; i <= l; i++ {
dp[i] = MAXN
}
for i := 1; i <= l; i++ {
for j := max(i-t, 0); j <= i-s; j++ {
dp[i] = min(dp[i], dp[j]+boolToInt(stone[i]))
}
}
ans := MAXN
for i := distance[m] + 1; i <= l; i++ {
ans = min(ans, dp[i])
}
fmt.Println(ans)
}
} func reduce(s int, t int) int {
for i := range reach {
reach[i] = false
}
cnt := 0
ans := 0
for i := 0; i < MAXK; i++ {
for j := i + s; j < min(i+t+1, MAXK); j++ {
reach[j] = true
}
if !reach[i] {
cnt = 0
} else {
cnt++
}
if cnt == t {
ans = i
break
}
}
return ans
} func min(a, b int) int {
if a < b {
return a
}
return b
} func max(a, b int) int {
if a > b {
return a
}
return b
} func boolToInt(b bool) int {
if b {
return 1
}
return 0
}

c++完整代码如下:

#include <iostream>
#include <algorithm>
using namespace std; const int MAXN = 101;
const int MAXL = 100001;
const int MAXK = 201; int arr[MAXN];
int distance0[MAXN];
int dp[MAXL];
bool stone[MAXL];
bool reach[MAXK]; int l, s, t, m, cut; int reduce(int s, int t) {
fill(reach, reach + MAXK, false);
int cnt = 0;
int ans = 0;
for (int i = 0; i < MAXK; i++) {
for (int j = i + s; j < min(i + t + 1, MAXK); j++) {
reach[j] = true;
}
if (!reach[i]) {
cnt = 0;
}
else {
cnt++;
}
if (cnt == t) {
ans = i;
break;
}
}
return ans;
} int main() {
int inputs[] = { 10, 2, 3, 5, 2, 3, 5, 6, 7 };
int ii = 0;
l = inputs[ii++];
s = inputs[ii++];
t = inputs[ii++];
m = inputs[ii++]; for (int i = 1; i <= m; i++) {
arr[i] = inputs[ii++];
}
if (s == t) {
int ans = 0;
for (int i = 1; i <= min(l, m); i++) {
if (arr[i] % s == 0) {
ans++;
}
}
cout << ans << endl;
}
else {
sort(arr + 1, arr + m + 1);
cut = reduce(s, t);
for (int i = 1; i <= m; i++) {
distance0[i] = distance0[i - 1] + min(arr[i] - arr[i - 1], cut);
stone[distance0[i]] = true;
}
l = min(l, distance0[m] + cut);
for (int i = 1; i <= l; i++) {
dp[i] = MAXN;
}
for (int i = 1; i <= l; i++) {
for (int j = max(i - t, 0); j <= i - s; j++) {
dp[i] = min(dp[i], dp[j] + (stone[i] ? 1 : 0));
}
}
int ans = MAXN;
for (int i = distance0[m] + 1; i <= l; i++) {
ans = min(ans, dp[i]);
}
cout << ans << endl;
}
return 0;
}

c语言代码如下:

#include <stdio.h>
#include <stdbool.h> #define MAXN 101
#define MAXL 100001
#define MAXK 201 int arr[MAXN];
int distance[MAXN];
int dp[MAXL];
bool stone[MAXL];
bool reach[MAXK];
int l, s, t, m, cut; int min(int a, int b) {
return a < b ? a : b;
} int max(int a, int b) {
return a > b ? a : b;
} int reduce(int s, int t) {
for (int i = 0; i < MAXK; i++) {
reach[i] = false;
}
int cnt = 0;
int ans = 0;
for (int i = 0; i < MAXK; i++) {
for (int j = i + s; j < (i + t + 1 < MAXK ? i + t + 1 : MAXK); j++) {
reach[j] = true;
}
if (!reach[i]) {
cnt = 0;
}
else {
cnt++;
}
if (cnt == t) {
ans = i;
break;
}
}
return ans;
} void sortInts(int* arr, int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
} void printAns(int ans) {
printf("%d\n", ans);
} int main() {
int inputs[] = { 10, 2, 3, 5, 2, 3, 5, 6, 7 };
int ii = 0;
l = inputs[ii++];
s = inputs[ii++];
t = inputs[ii++];
m = inputs[ii++]; for (int i = 1; i <= m; i++) {
arr[i] = inputs[ii++];
}
if (s == t) {
int ans = 0;
for (int i = 1; i <= min(l, m); i++) {
if (arr[i] % s == 0) {
ans++;
}
}
printAns(ans);
}
else {
sortInts(arr + 1, m);
cut = reduce(s, t);
for (int i = 1; i <= m; i++) {
distance[i] = distance[i - 1] + min(arr[i] - arr[i - 1], cut);
stone[distance[i]] = true;
}
l = min(l, distance[m] + cut);
for (int i = 1; i <= l; i++) {
dp[i] = MAXN;
}
for (int i = 1; i <= l; i++) {
for (int j = max(i - t, 0); j <= i - s; j++) {
dp[i] = min(dp[i], dp[j] + (stone[i] ? 1 : 0));
}
}
int ans = MAXN;
for (int i = distance[m] + 1; i <= l; i++) {
ans = min(ans, dp[i]);
}
printAns(ans);
}
return 0;
}

2024-01-06:用go语言,在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧 在桥上有一些石子,青蛙很讨厌踩在这些石子上 由于桥的长度和青蛙一次跳过的距离都是正整数 我们可以把独木桥的更多相关文章

  1. 【C】 01 - 再学C语言

    “C语言还用再学吗?嵌入式工程师可是每天都在用它,大家早就烂熟于心,脱离语言这个层面了”.这样说不无道理,这门古老的语言以其简单的语法.自由的形式的而著称.使用C完成工作并不会造成太大困扰,所以很少有 ...

  2. IP概念盛行的背后:资本在狂欢,电影想哭泣 IP,英文“Intellectual Property”的缩写,直译为“知识产权”。它的存在方式很多元,可以是一个故事,也可以是某一个形象,运营成功的IP可以在漫画、小说、电影、玩具、手游等不同的媒介形式中转换。

    IP概念盛行的背后:资本在狂欢,电影想哭泣 IP容易拉投资.谈合作,甚至还能简化宣发途径,越来越多的人涌入了电影这个产业,争抢IP成为他们进入行业的最快捷的方法.IP盛行暴露出的另一个问题是国产电影原 ...

  3. 在linux安装redis单机和集群后,如何在windows上使用redis客户端或者java代码访问错误的原因很简单,就是没有连接上redis服务,由于redis采用的安全策略,默认会只准许本地访问。需要通过简单配置,完成允许外网访问。

    这几天在学习在linux上搭建服务器的工作,可谓历经艰辛.可喜最后收获也不少. 这次是在linux上搭建redis服务器后从windows上缺无法访问,连接不上. 仔细回忆以前搭建nginx和ftp的 ...

  4. SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制

    SpringBoot1.x升级SpringBoot2.x踩坑之文件上传大小限制 前言 LZ最近升级SpringBoo框架到2.1.6,踩了一些坑,这里介绍的是文件上传大小限制. 升级前 #文件上传配置 ...

  5. JavaSE学习总结第06天_Java语言基础2 & 面向对象1

      06.01 二维数组概述和格式1的讲解 二维数组概述:二维数组其实就是一个元素为一维数组的数组 格式1:数据类型[][] 变量名 = new 数据类型[m][n]; m表示这个二维数组有多少个一维 ...

  6. ny737 石子合并(一) 总结合并石子问题

    描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子合并 ...

  7. 【工具向01】——markdown 文本编辑语言相关

    markdown简介 Markdown是一种轻量级标记语言创始人为约翰·格鲁伯.它允许人们"使用易读易写的纯文本格式编写文档,然后转换成有效的XHTML或HTML文档".这种语言吸 ...

  8. @雅礼集训01/06 - T3@ math

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出 n, m, x,你需要求出下列式子的值: \[\sum_{ ...

  9. 【计理05组01号】R 语言基础入门

    R 语言基本数据结构 首先让我们先进入 R 环境下: sudo R 赋值 R 中可以用 = 或者 <- 来进行赋值 ,<- 的快捷键是 alt + - . > a <- c(2 ...

  10. C语言学习-01第一个C语言程序

    一 C语言的历史 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供 ...

随机推荐

  1. JS深入学习笔记 - 第三章.变量作用域与内存

    1.原始值和引用值 ECMScript变量包含两种不同类型是数据:原始值和引用值. 原始值:最简单的数据.有6中原始值:Undefined.Null.Boolean.Number.String和Sym ...

  2. Codechef - Longest AND Subarray(位运算)

    题目大意   给定一个正整数N,其序列为[1, 2, 3, ..., N],找到一个长度最大的连续子列,使得其所有元素取与运算的结果为正(最终输出只需要输出最大长度即可). 思路   刚开始可能并不好 ...

  3. MySQL innoDB 间隙锁产生的死锁问题

    背景 线上经常偶发死锁问题,当时处理一张表,也没有联表处理,但是有两个mq入口,并且消息体存在一样的情况,频率还不是很低,这么一个背景,我非常容易怀疑到,两个消息同时近到这一个事务里面导致的,但是是偶 ...

  4. 使用Arduino制作摩尔斯电码收发器

    摩尔斯电码通过不同的排列顺序来表达不同的英文字母.数字和标点符号等.在今天,国际摩尔斯电码依然被使用着.比如,摩尔斯电码最广为人知的用法发送求救信号SOS,SOS信号的组合方式为:.再比如,假设我们通 ...

  5. 21.1 Python 使用PEfile分析PE文件

    PeFile模块是Python中一个强大的便携式第三方PE格式分析工具,用于解析和处理Windows可执行文件.该模块提供了一系列的API接口,使得用户可以通过Python脚本来读取和分析PE文件的结 ...

  6. 组合的输出 题解(lgP1157)

    一看就是 dfs 然而窝并不会做 调了一个多小时才调出来.漏洞连篇.(第一次写的基本没有对的地方QAQ 题解见注释. #include<bits/stdc++.h> using names ...

  7. VRRP相关简述

    VRRP 诞生原因 单网关,出问题时,旗下所有主机无法通信. 多网关,容易产生网关冲突. 而,VRRP能够在不改变组网的情况下,将多台路由器虚拟成一个虚拟路由器,通过配置虚拟路由器的IP地址为默认网关 ...

  8. Windows下SVN服务端(Subversion)及客户端(TortoiseSVN)详细安装教程

    1. Subversion和TortoiseSVN 是什么? http://www.uml.org.cn/pzgl/200811146.asp Subversion 是什么,我想如果不知道的话就没有必 ...

  9. Python 异常处理:try、except、else 和 finally 的使用指南

    异常处理 当发生错误(或我们称之为异常)时,Python 通常会停止执行并生成错误消息. try 块用于测试一段代码是否存在错误. except 块用于处理错误. else 块用于在没有错误时执行代码 ...

  10. 一篇文章让你理解:什么是Spring???

    背景 市场上,随便一个Java工程师的招牌要求上,都可以看到SSM.Spring.SpringMVC...类似字样.这玩意到底是个啥? 这是中邮消费招聘的岗位要求,可以看到第3点: 3.熟悉Strut ...