网易2017春招[编程题]双核处理

来源:互联网 发布:ubuntu哪个版本最稳定 编辑:程序博客网 时间:2024/06/06 20:43


链接:https://www.nowcoder.com/questionTerminal/9ba85699e2824bc29166c92561da77fa
来源:牛客网

[编程题]双核处理
  • 热度指数:36833时间限制:1秒空间限制:32768K
  • 算法知识视频讲解
一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。
输入描述:
输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。


输出描述:
输出一个整数,表示最少需要处理的时间
示例1

输入

5 3072 3072 7168 3072 1024

输出

9216

package go.jacob.day912;import java.util.Scanner;public class Demo1 {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] arr = new int[n];int sum = 0;for (int i = 0; i < n; i++) {arr[i] = sc.nextInt() >> 10;sum += arr[i];}int[][] res = new int[n + 1][sum / 2 + 1];for (int i = 0; i < n; i++) {for(int j=sum/2;j>=0;j--){if(j>=arr[i]){res[i+1][j]=Math.max(res[i][j], res[i][j-arr[i]]+arr[i]);}else{//else条件必须有res[i+1][j]=res[i][j];}}/*for (int j = 0; j < sum / 2; j++) {if (j + 1 >= arr[i]) {res[i + 1][j + 1] = Math.max(res[i][j + 1], res[i][j + 1 - arr[i]] + arr[i]);}}*/}System.out.println(Math.max(res[n][sum / 2], sum - res[n][sum / 2]) << 10);sc.close();}}

解法二:

package go.jacob.day912;import java.util.Scanner;public class Demo2 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);int n=sc.nextInt();int[] arr=new int[n];int sum=0;for(int i=0;i<n;i++){arr[i]=sc.nextInt()>>10;sum+=arr[i];}//如果只用一维数组,j必须从sum/2慢慢减小。如果用二维数组,则无所谓int[] dp=new int[sum/2+1];for(int i=0;i<n;i++){for(int j=sum/2;j>=arr[i];j--){dp[j]=Math.max(dp[j], dp[j-arr[i]]+arr[i]);}/*错误的解法:不能从头往后遍历,会修改上一轮的计算  * for(int j=0;j<sum/2;j++){if(j+1>=arr[i]){dp[j+1]=Math.max(dp[j+1], dp[j+1-arr[i]]+arr[i]);}}*/}System.out.println(Math.max(dp[sum/2], sum-dp[sum/2])<<10);sc.close();}}




原创粉丝点击