网易题目:一种双核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;
}