zoukankan      html  css  js  c++  java
  • 拼车

    拼车----模拟的方法

    假设你是一位顺风车司机,车上最初有 capacity 个空座位可以用来载客。由于道路的限制,车 只能 向一个方向行驶(也就是说,不允许掉头或改变方向,你可以将其想象为一个向量)。

    这儿有一份乘客行程计划表 trips[][],其中 trips[i] = [num_passengers, start_location, end_location] 包含了第 i 组乘客的行程信息:

    必须接送的乘客数量;
    乘客的上车地点;
    以及乘客的下车地点。
    这些给出的地点位置是从你的 初始 出发位置向前行驶到这些地点所需的距离(它们一定在你的行驶方向上)。

    请你根据给出的行程计划表和车子的座位数,来判断你的车是否可以顺利完成接送所有乘客的任务(当且仅当你可以在所有给定的行程中接送所有乘客时,返回 true,否则请返回 false)。

    示例 1:

    输入:trips = [[2,1,5],[3,3,7]], capacity = 4
    输出:false
    示例 2:

    输入:trips = [[2,1,5],[3,3,7]], capacity = 5
    输出:true
    示例 3:

    输入:trips = [[2,1,5],[3,5,7]], capacity = 3
    输出:true
    示例 4:

    输入:trips = [[3,2,7],[3,7,9],[8,3,9]], capacity = 11
    输出:true

    思路:因为车只能往前走,不能掉头;所以我们以这条线进行一个for循环,循环每个地点,看看座位数是否满足上车下车。
    第一步,先找出下车地点的最大值,也就是车上的人全部下完的地点。
    for(int i=0;i<trips.length;i++){
    if(max<trips[i][2]){
    max=trips[i][2];
    }
    }
    第二步,因为每个地点都可能有上车的人和下车的人,下车,则车里的人数减少;上车,车里的人数增加。
    计算上下车人数;
    int start=new int[max+1];
    int end=new int[max+1];
    for(int i=0;i<trips.length;i++){
    start[trips[i][1]]+=trips[i][0];
    end[trips[i][2]]+=trips[i][0];

    }
    第三步,因为车只跑一趟,我们必须保证该地点所有人上车,而且上车以后有座位坐,否则直接返回false。也就是说,我们可以模拟上下车,记录车里的人数。如果某个地点,人上车后,车里的座位数不够,那么返回false.
    int count=0;//记录车里的人数
    for(int i=0;i<max;i++){
    count-=end[i];//end[i]是指下车人数
    count+=start[i];start[i]是指上车人数
    if(count<capacity){
    return false;
    }
    return true;
    完整代码:
    '''

        class Solution {
      public boolean carPooling(int[][] trips, int capacity) {
        if(trips.length == 0){
            return true;
        }
        //找出最大值(最后一个下车的地点)
        int max=0;
        for(int i=0;i<trips.length;i++){
            if(max<trips[i][2]){
                max=trips[i][2];
            }
        }
        int[] start = new int[max + 1];//记录哪个点有多少人上车
        int[] end = new int[max + 1];//记录哪个点有多少人下车
        for(int i = 0; i < trips.length; i++){
            
            start[trips[i][1]] += trips[i][0];
            end[trips[i][2]] += trips[i][0];
        }
        //模拟上下车
        int count = 0;//车里的人数
        for(int i = 0; i < max; i++){
            count -= end[i];
            count += start[i];
            if(count > capacity){
                return false;
            }
        }
        return true;
    }
    }
    学习让我快乐,工作让我快乐。学习和工作都是为了更好的生活!
  • 相关阅读:
    SSLZYC NOIP
    SSLZYC 懒惰的奶牛①
    SSLZYC 小麦高度
    Pythonlog() 函数
    详细解读Python中的__init__()方法
    详细解读Python中的__init__()方法
    Linux软件安装中RPM与YUM 区别和联系
    Linux软件安装中RPM与YUM 区别和联系
    【我的物联网成长记】设备如何进行选型?
    【我的物联网成长记】设备如何进行选型?
  • 原文地址:https://www.cnblogs.com/xyuanzi/p/14588949.html
Copyright © 2011-2022 走看看