题目描述:
启动速度时APP的核心内容但在超级APP中经常出现由于启动任务繁多导致启动速度慢的问题。因此我们尝试通过并行启动任务加快启动速度。假设启动任务都是独立的,并且多线程并行执行,那么恰定一组正整数(<=50)个表示一组任务,每个数字表示启动任务耗时,所有的耗时之和(<10000),请算出该组任务的所需的最短耗时。
输入
11
1 10 100 200 50 90 30 20 10 27 57
输出
298
。。。。。。。。。。。。。。。。。。
题目分析:
题目要求所需时间最短,抛开这些文字,看题目的输入输出,先对这串数据进行排序{1,10,10,20,27,30,50,57,90,100,200}.
我们创建两个线程a,b;
首先把最大的两个数分别放入a,b中,此时a=200,b=100,
200>100,所以90放入b中,a=200,b=100+90=190;
200>190, 所以57放入b中,a=200,b=190+57=247;
200<247,所以50放入a中,a=200+50=250,b=247;
250>247,所以30放入b中,a=250,b=247+30=277;
250<277,所以27放入a中,a=250+27=277,b=277;
277=277,所以20放入a,b都可以,假设放入a,a=277+20=297,b=277;
297>277,所以下来的两个10都要放入b中,a=297,b=277+10+10=297;
此时297=297,最后一个1随便放,即为最终答案。
现在我们回过头来发现这道题其实非常简单了吧!至于a和b是两个整形数还是两个容器,还是两个栈,看大家爱好了!
直接上代码。
import java.util.Arrays;
import java.util.Scanner;
public class ali2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] a = new int[n];
for (int i = 0; i < a.length; i++) {
a[i] = sc.nextInt();
}
Arrays.sort(a);
int num1 = 0;
int num2 = 0;
for (int i = a.length-1; i >=0; i--) {
if (num1 >= num2) {
num2 += a[i];
}else {
num1 += a[i];
}
}
System.out.println(Math.max(num1, num2));
}
}