华为笔试-最快传输

题目描述

有一批数据包需要传输,每个数包大小不一样,传输需要不同的时长,现在有N个传输通道,每个通道的大小也不一样,通道只能传输小于等于自己大小的数据包,不同通道可以同时传输数据包,通道中可以缓存多个数据包,当新任务来时,可以先进入缓存队列等待发送,问最短需要多长时间能够传输完成,通道会确保所有数据都可以传输

输入

第一行M N, M表示队列长度,N表示传输通道数
第二行有N个数,表示每个通道的大小P
第三行有M个数,表示每个数据包的大小Q
第四行有M个数,表示每个数据包传输时长S
1 <= M, S, P, Q <= 10000 ; 1 <= N <= 1000

输出

输出传输完所有数据包需要的最短时长

样例1

输入:
5 2
5 3
1 4 5 2 3
1 6 10 3 4
输出:16
解释:数据包3进入通道1、数据包2进入通道1,数据包5进入通道2,数据包4进入通道2, 数据包1进入通道2; 通道1的传输时长是10+6=16,通道2的传输时长是3+2+1=8,这样最短时长就为16

样例2

输入:
3 2
6 13
2 11 5
3 25 14
输出:25
解释:数据包2进入通道2、数据包3进入通道1,数据包1进入通道1; 通道1的传输时长是14+3=17,通道2的传输时长是25,这样最短时长就为25

代码

//该题贪心算法可以AC,可能笔试的测试数据比较简单,有人给出了该代码过不了的测试案例
let readlineSync = require('readline-sync');
readlineSync.setDefaultOptions({ prompt: '' })
let readline = readlineSync.prompt
let fastTransfer = (M, N, channels, numsQ) => {
    numsQ.sort((a, b) => {
        if(a[1] === b[1]) { 
            return a[0] - b[0];//如果传输时长一样,则数据小的排前面
        }
        return b[1] - a[1];//因为要先传输耗时长的数据,再依次传输耗时短的数据
    });
    let max = 0;
    for(let data of numsQ) {
        let minTime = Number.MAX_VALUE;
        let select = 0;
        for(let i = 0; i < N; i++) {
            if(channels[i][0] >= data[0]) {//如果当前通道 i能传输当前数据
                if(channels[i][1] < minTime) {
                    select = i;//优先选择所有通道中已传输时长最短的那个
                    minTime = channels[i][1];
                } else if(channels[i][1] === minTime && channels[select][0] > channels[i][0]) {
                    select = i; //如果已选择的通道与当前通道的时长相等,则选择更小的通道传输该数据
                }
            }
        }
        channels[select][1] += data[1];
        max = Math.max(max, channels[select][1]);//不断记录传输时长最长的那个通道
    }
    return max;
}
let firstLine = readline().split(" ");
let M = parseInt(firstLine[0]);//队列长度,即数据包个数
let N = parseInt(firstLine[1]);//通道数
let secondLine = readline().split(" ");//通道的大小
let thirdLine = readline().split(" ");//数据的大小
let fourthLine = readline().split(" ");//数据传输时长
let channels = [];//通道大小
let numsQ = [];//数据包大小和传输时间
for(let c of secondLine) {
    channels.push([parseInt(c), 0]);
}
for(let i = 0; i < M; i++) {
    numsQ.push([parseInt(thirdLine[i]), parseInt(fourthLine[i])]);
}
let res = fastTransfer(M, N, channels, numsQ);
console.log("res = " + res);
//题中的测试案例都能过,但是这个案例过不了
//5 2
//100 100
//7 6 4 3 2
//7 6 4 3 2
//程序输出12,最优解应该是11(7 + 4, 6 + 3 + 2)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容