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


链接: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>10;
			sum+=arr[i];
		}
		//如果只用一维数组,j必须从sum/2慢慢减小。如果用二维数组,则无所谓
		int[] dp=new int[sum/2+1];
		for(int i=0;i=arr[i];j--){
				dp[j]=Math.max(dp[j], dp[j-arr[i]]+arr[i]);
			}
			/*错误的解法:不能从头往后遍历,会修改上一轮的计算 
			 * for(int j=0;j=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();
	}
}




你可能感兴趣的:(校招算法题)