01背包问题以及网易考题

网易题目:一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。

解题思路:求双核完成的最短时间,最佳情况下是两个双核同时完成任务,所花的最短时间就是sum/2,sum是所有任务加起来的时间。设A核完成任务所需时间是t1,B核时间就是sum-t1,双核完成的最短时间就是max(t1, sum-t1)。说到这里,就会想到用01背包问题来解决,在规定的容量内,装最有价值的商品。转化就是在sum/2+1的时间空间内,完成最多的任务。

举例子:任务【3,3,7,3,1】

sum = 3 + 3 + 7 + 3 + 1 = 17;
average = sum/2 + 1 = 9;
arr = [7, 3, 3, 3, 1];
for(int i=0;i<arr.length;i++){
    for(int j = average;j<=0;j--){
        dp[j] = max(dp[j-arr[i]]+arr[i]);
    }
}

A核先装7,dp[9] = dp[2]+7;剩下2个容量,看接下来的数字,只能装比容量小或者等于的数字,最后时间加起来等于t1,另外一个就是sum-t1,最短时间就出来了,max(t1, sum-t1)。

js实现

var arr = [3,3,7,3,2,1];
function packageQues(arr) {
    var _arr = arr.sort(sortNumber);
    var arrOne = [];
    var arrTwo = [];
    var len = arr.length;
    var sum = 0;
    var sum1 = 0;
    var sum2 = 0;
    for(var i=0;i<len;i++){
        sum+=_arr[i];
    }
    var average = Math.floor(sum / 2) + 1;
    for(var m=0;m<len;m++){
        if(average > _arr[m]){ // 容量大于数组数据
            average = average - _arr[m];
            arrOne.push(_arr[m]);
            sum1+=_arr[m];
        } else {
            arrTwo.push(_arr[m]);
            sum2+=_arr[m];
        }
    }
    var max  = Math.max(sum1, sum2);
    return max;
}
function sortNumber(a, b){
    return b - a;
}

网易题目:
终于到周末啦!小易走在市区的街道上准备找朋友聚会,突然服务器发来警报,小易需要立即回公司修复这个紧急bug。假设市区是一个无限大的区域,每条街道假设坐标是(X,Y),小易当前在(0,0)街道,办公室在(gx,gy)街道上。小易周围有多个出租车打车点,小易赶去办公室有两种选择,一种就是走路去公司,另外一种就是走到一个出租车打车点,然后从打车点的位置坐出租车去公司。每次移动到相邻的街道(横向或者纵向)走路将会花费walkTime时间,打车将花费taxiTime时间。小易需要尽快赶到公司去,现在小易想知道他最快需要花费多少时间去公司。

输入描述:
输入数据包括五行:
第一行为周围出租车打车点的个数n(1 ≤ n ≤ 50)
第二行为每个出租车打车点的横坐标tX[i] (-10000 ≤ tX[i] ≤ 10000)
第三行为每个出租车打车点的纵坐标tY[i] (-10000 ≤ tY[i] ≤ 10000)
第四行为办公室坐标gx,gy(-10000 ≤ gx,gy ≤ 10000),以空格分隔
第五行为走路时间walkTime(1 ≤ walkTime ≤ 1000)和taxiTime(1 ≤ taxiTime ≤ 1000),以空格分隔

输出描述:
输出一个整数表示,小易最快能赶到办公室的时间

function quickTime(_a,_xData, _yData, destination, walkTime, taxiTime ) {
    var timeSum = [];
    for(var i = 0;i < _a; i++){
        var t1 = (Math.abs(_xData[i]) + Math.abs(_yData[i])) * walkTime;
        var t2 = ( Math.abs(_xData[i] - destination[0]) + Math.abs(_yData[i] - destination[1]) ) * taxiTime;
        timeSum.push(t1 + t2);
    }
    return timeSum;

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值