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

 

阿里巴巴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是两个整形数还是两个容器,还是两个栈,看大家爱好了!

直接上代码。

[java]  view plain  copy
  1. import java.util.Arrays;  
  2. import java.util.Scanner;  
  3.   
  4. public class ali2 {  
  5.   
  6.     public static void main(String[] args) {  
  7.         // TODO Auto-generated method stub  
  8.      Scanner sc = new Scanner(System.in);  
  9.      int n = sc.nextInt();  
  10.      int[] a = new int[n];  
  11.      for (int i = 0; i < a.length; i++) {  
  12.         a[i] = sc.nextInt();  
  13.     }  
  14.      Arrays.sort(a);  
  15.        
  16.      int num1 = 0;  
  17.      int num2 = 0;  
  18.      for (int i = a.length-1; i >=0; i--) {  
  19.         if (num1 >= num2) {  
  20.             num2 += a[i];  
  21.         }else {  
  22.             num1 += a[i];  
  23.         }  
  24.     }  
  25.      System.out.println(Math.max(num1, num2));  
  26.     }  
  27.   
  28. }  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值