zoukankan      html  css  js  c++  java
  • 【HackerRank】Bus Station

    n组好朋友在公交车站前排队。第i组有ai个人。还有一辆公交车在路线上行驶。公交车的容量大小为x,即它可以同时运载x个人。 当车站来车时(车总是空载过来),一些组从会队头开始走向公交车。 当然,同一组的朋友不想分开,所以仅当公交车能容纳下整个组的时候,他们才会上车。另外,每个人不想失去自己的位置,即组的顺序不会改变。 问题时如何选择公交车的容量大小x使得它可以运走所有组的人,并且公交车每次从车站出发时没有空位?(在车里的总人数恰好达到x)?

    输入格式

    第一行只包含一个整数n。第二行包含n个空格分隔的整数a1,a2,,an

    输出格式

    按递增顺序输出所有可能的公交车的容量。


    题解:假设一共total_people个人,那么满足条件的车的容量一定能够整除total_people;于是就枚举total_people的因子们,然后看每个因子是否能满足条件。再看每个因子是否能满足条件的时候,通过遍历数组就可以做到了,由于每组不愿意放弃自己的位置,所以就可以从前往后模拟上车,如果在某一趟上车时有一个组无法正好上车,那么对应的x就不满足条件了。

    主要注意两点:

    • 枚举total_people因子的时候,只用从1枚举到sqrt(total_people),因为知道total_people的一个因子r,就可以通过total_people/r得到另外一个因子了。要特别处理的情况是r=total_people/r的情况,此时只留一个因子;
    • 还要注意最后一趟上车要保证剩下的人全部上车(参见代码17行)。

    代码如下:

     1 import java.io.*;
     2 import java.util.*;
     3 import java.math.*;
     4 
     5 
     6 public class Solution {
     7     private static boolean Check(int[] groups,int d){
     8         int curPeople = 0;
     9         for(int i = 0;i < groups.length;i++)
    10         {
    11             curPeople += groups[i];
    12             if(curPeople > d)
    13                 return false;
    14             if(curPeople == d)
    15                 curPeople = 0;
    16         }
    17         return curPeople == 0;
    18     }
    19     public static void main(String[] args) {
    20         Scanner in = new Scanner(System.in);
    21         int n = in.nextInt();
    22         int total_people = 0;
    23         int[] groups = new int[n];
    24         
    25         for(int i = 0;i < n;i++){
    26             groups[i]= in.nextInt();
    27             total_people += groups[i];
    28         }
    29         
    30         ArrayList<Integer> answer = new ArrayList<Integer>();
    31         
    32         for(int d = 1;d*d <= total_people;d++){
    33             if(total_people % d == 0){
    34                 if(Check(groups, d))
    35                     answer.add(d);
    36                 if(total_people/d != d && Check(groups, total_people/d))
    37                     answer.add(total_people/d);
    38             }
    39         }
    40         answer.sort(null);
    41         
    42         StringBuffer sb = new StringBuffer();
    43         for(Integer i:answer)
    44             sb.append(i).append(" ");
    45         System.out.println(sb.toString());
    46         
    47       }
    48 }
  • 相关阅读:
    161012、JAVA读写文件,如何避免中文乱码
    161011、oracle批量插入数据
    161010、在大型项目中组织CSS
    160930、Javascript的垃圾回收机制与内存管理
    160929、各数据库连接配置与maven依赖安装
    Selenium学习(8) Cookie处理
    Selenium学习(7) 文件上传
    Selenium学习(6) 控制浏览器操作
    Selenium学习(5) 元素等待
    Selenium学习(4) 键盘操作
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3887504.html
Copyright © 2011-2022 走看看