阿里巴巴2018秋招提前批Android开发编程测试题

题目描述:

启动速度时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));
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值