『面试题』双核CPU

博客围绕双核CPU处理任务展开,提出设计方案使处理n个已知数据量任务的时间最少。题解指出这是01背包变种,将总任务时间sum除以2,让每个CPU处理接近sum/2的任务量可使总时间最小,把背包设为sum/2,任务体积和价值均为value。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

『题目』:

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

『题解』:

 这道题比较简单,是01背包变种,其实就是总共的任务要的时间加起来得到 sumsumsum ,然后将 sumsumsum 除以 222,因此最好的情况就是每个CPU处理 sum/2sum/2sum/2 的任务量,如果某一任务所作的任务无限接近于 sum/2sum/2sum/2,那么两个CPU之间的误差就是最小的,总时间花费也是最小的。这时候只要把背包当作 sum/2sum/2sum/2,而任务的体积是 valuevaluevalue,价值也是 valuevaluevalue

『注意』:

该想法没有在OJ上测试过,若有错误请指点

『实现』:

import java.util.Scanner;
/**
 * Author:
 *      Gavinjou大笨象
 * Date:
 *      2019-05-01
 * Description:
 *      DP题
 */
public class beibaoOn2 {

    //总共的值
    private static int sum = 0;
    private static  int sum2 = 0;
    //任务个数
    private static int n = 0;
    //每个任务要处理的kb数
    private static int[] jobs;
    //最好的cpu要做的任务数
    private static int[][] num;

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        jobs = new int[n];

        //读取每个任务的量,同时计算和
        for (int i = 0; i < n; i++)
        {
            jobs[i] = in.nextInt();
            sum += jobs[i];
        }
        sum2 = sum;
        //总任务量除以一半,求出背包容量
        sum = sum / 2;

        num = new int[sum + 1][n + 1];

        for(int i = 1;i <= n; i++)
        {
            int valuei = jobs[i - 1];
            for(int j = valuei;j <= sum;j++)
            {
                //究竟是装这个任务的获取的价值大,还是把容量装剩下i-1个任务
                num[j][i] = Math.max(num[j-valuei][i - 1]+valuei,num[j][i - 1]);
            }
        }

        //第一个CPU花的时间和第二个CPU花的时间
        System.out.println(num[sum][n] + "    "+ (sum2 - num[sum][n]));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值