字节前端笔试,编程题是两道。
徒步花费问题 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]);