2022.03.20字节前端第二题 徒步

本文介绍了一道字节前端笔试编程题的解决方案,题目要求计算从A徒步到B所需的最低食物花费。通过动态规划算法,文章给出了清晰的解题思路与实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字节前端笔试,编程题是两道。

徒步花费问题 JavaScript版本
通过率100%

题目描述:
小明想从A徒步到B,总路程需要M天,路程中为了确保安全,小明需要每天消耗1份食物。
在起点及路程当中,零星分布着N个补给站,可以补充食物,不同补给站的食物价格可能不同。
请问小明若要安全完成徒步,最少需要花费多少钱呢?

输入描述:
第一行为两个正整数M、N,代表总路程M天,补给站个数N
接下来N行,每行有两个非负整数A、B代表一个补给站,表示第A天经过该补给站,每份食物的价格为B元。
A是从0开始严格递增的,即起点一定有补给站,补给站是按位置顺序给出的,且同一个位置最多有一个补给站。

输出描述:
输出一个整数,表示最少花费的金额

实例:
输入
5 4
0 2
1 3
2 1
3 2
输出
7
解释:每一天的花费分别为2 2 1 1 1,最后总花费为7

无注释代码,采用JavaScript V8进行输入和输出


//输入
let lines = readline().split(" ");
const m = parseInt(lines[0]); 
let n = parseInt(lines[1]); 
let a = [], 
  b = []; 
while (n--) {
  lines = readline().split(" ");
  a.push(parseInt(lines[0]));
  b.push(parseInt(lines[1]));
}

//正式开始费用计算
let curCost; 
let minCost = b[0]; 
let dp = new Array(m).fill(0);
dp[0] = b[0]; 

for (let i = 1; i < m; i++) {
  curCost = a[i] !== i ? Infinity : b[i]; 
  minCost = Math.min(curCost, minCost);
  dp[i] = dp[i - 1] + minCost;
}

//输出
console.log(dp[m - 1]);

详细注释代码
只要找到目前为止的最小值,然后按该最小值进行购买即可,直到遇到下一个最小值,注意会存在该天不存在补给站的情况

//下面是按照JavaScript V8的数值输入和输出
let lines = readline().split(" ");
const m = parseInt(lines[0]); //天数
let n = parseInt(lines[1]); //补给站个数
let a = [], //a是第N天
  b = []; // b是第N天的的食物价格
while (n--) {
  lines = readline().split(" ");
  a.push(parseInt(lines[0]));
  b.push(parseInt(lines[1]));
}

//正式开始费用计算
let curCost; //当天的价格 存在无穷大的情况
let minCost = b[0]; //第i天的能买到的最便宜食物的价格,初始值为第0天的价格
let dp = new Array(m).fill(0);
dp[0] = b[0]; //dp是动态规划数组,存储每一天的累计最小花费

//对每一天进行遍历 
for (let i = 1; i < m; i++) {
  //如果每天都有补给站,那么i应该和a数组里面存的天数是一样的,则当前价格就对应价格b[i]

  //但如果有哪一天缺少了,则i的值和a[i]对应的值不一致
  //例如例题输入是缺少最后一天(第四天i=4)的补给站,
  //表明这天没有补给站,此时a[4]是undefined 与i=4是不等的
  //则直接将这一天的花费设置为无穷大
  curCost = a[i] !== i ? Infinity : b[i]; 

  //minCost是目前为止的最小花费,目前为止的最便宜价格要和今天的食物价格进行比较
  minCost = Math.min(curCost, minCost);

  //今天的总花费等于昨天的总花费+目前的最便宜食物价格
  //相当于从最便宜的那一天一直买到今天
  dp[i] = dp[i - 1] + minCost;
}

//输出
console.log(dp[m - 1]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值