腾讯wxg前端实习代码面的一道背包问题,一起来做做?

微信小程序团队一共有 n 名成员,决定出去秋游,在海边遇到出租摩托艇的杰克马,马先生手上有 m 辆待出租的摩托艇,价格分别是 b1 b2 ... bm;

由于习惯了微信支付,团队中每个人身上的现金都有限,分别是 a1 a2 ... an,对了,一起出门的老板还带有 S 元的团队经费,这个经费是每个人都可以使用的


那么考虑以下两个场景


场景1

团队成员都很有爱,都愿意借钱给其他同事,那么这时候团队最多能租到多少摩托艇


function max( Array n, Array m, S) {

return num

}


场景2

团队成员都十分小气,是不愿意借钱给别人的,那么请考虑以下两个问题


//问题一 老板是否能想到一个策略,使得所有人都能租到摩托艇?

function isAll(Array n, Array m, S){

return bool

}


//问题二 请问给出一个策略

// - 使得整个团队租到最多的摩托艇

// - 在租到最多摩托艇的情况下,整体的支出尽量的少


function max( Array n, Array m, S) {

return {

num,// 多少摩托艇

cost // 总体资金支出

}

}


#腾讯##笔试题目#
全部评论
没测试,可能有错,肯定大佬指正。个人觉得不是背包。 有爱: public static int isAll(int[] n, int[] m, int S){ int sum = Arrays.stream(n).sum() + S; Arrays.sort(m); int i = 0; while (sum - m[i] > 0) { sum -= m[i]; i++; } return i; } 无爱问题1: public static boolean isAll(int[] n, int[] m, int S){ if (n.length > m.length) { return false; } Arrays.sort(n); Arrays.sort(m); for (int i=0; i<n.length; i++) { int need = n[i] - m[i]; if (need < 0) S += need; } return S >= 0; } 无爱问题2: private static int n[]; private static int m[]; private static int S; public static int[] isAll(int[] n, int[] m, int S){ Arrays.sort(n); Arrays.sort(m); Main.n = n; Main.m = m; Main.S = S; int l =0, r = m.length; while (l < r) { int mid = l + r + 1 >> 1; if (can(mid)) { l = mid; } else { r = mid - 1; } } int ans = 0; for (int i=0; i<l; i++) { ans += m[i]; } return new int[] {l, ans}; } private static boolean can(int count) { int tmpS = S; for (int i = count-1,j = n.length-1; i>=0; i--, j--) { if (n[j] < m[i]) { tmpS -= (m[i] - n[j]); } if (tmpS < 0) { return false; } } return true; }
点赞 回复
分享
发布于 2019-03-20 16:51
看起来就很难
点赞 回复
分享
发布于 2019-03-20 15:49
联想
校招火热招聘中
官网直投
有没有大佬贴个代码解读一下场景2的问题2呀🤨
点赞 回复
分享
发布于 2019-03-21 17:03
出租游艇的杰克马  哈哈哈哈哈
点赞 回复
分享
发布于 2019-03-21 17:04

相关推荐

4 23 评论
分享
牛客网
牛客企业服务