📜  在给定的约束下将所有箱子从源头运送到目的地所需的最短时间

📅  最后修改于: 2021-04-22 08:50:29             🧑  作者: Mango

给定两个数组box []truck [] ,其中box [i]代表第i箱子的重量,而truck [i]代表第i卡车可以承受的最大负载。现在,每辆卡车要花一个小时将一个箱子从源头运到目的地,然后又要花一个小时才能回来。现在,假设所有箱子都存放在源头,那么任务是找到将所有箱子从源头运送到目的地所需的最短时间。请注意,总是有一段时间可以运输箱子,并且在任何时候都只能用卡车搬运一个箱子。

例子:

方法:想法是使用二进制搜索并对两个数组进行排序,此处的下限为0 ,上限为2 * box []的大小,因为在最坏的情况下,运输所有盒子所需的时间将为2 *盒数组的大小,现在计算中间值,对于每个中间值,检查加载程序是否可以在时间=中间时间内运输所有盒子。如果是,则将上限更新为中– 1 ,如果否,则将下限更新为中+ 1

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function that returns true if it is
// possible to transport all the boxes
// in the given amount of time
bool isPossible(int box[], int truck[],
                int n, int m, int min_time)
{
    int temp = 0;
    int count = 0;
  
    while (count < m) {
        for (int j = 0; j < min_time
                        && temp < n
                        && truck[count] >= box[temp];
             j += 2)
            temp++;
  
        count++;
    }
  
    // If all the boxes can be
    // transported in the given time
    if (temp == n)
        return true;
  
    // If all the boxes can't be
    // transported in the given time
    return false;
}
  
// Function to return the minimum time required
int minTime(int box[], int truck[], int n, int m)
{
  
    // Sort the two arrays
    sort(box, box + n);
    sort(truck, truck + m);
  
    int l = 0;
    int h = 2 * n;
  
    // Stores minimum time in which
    // all the boxes can be transported
    int min_time = 0;
  
    // Check for the minimum time in which
    // all the boxes can be transported
    while (l <= h) {
        int mid = (l + h) / 2;
  
        // If it is possible to transport all
        // the boxes in mid amount of time
        if (isPossible(box, truck, n, m, mid)) {
            min_time = mid;
            h = mid - 1;
        }
        else
            l = mid + 1;
    }
  
    return min_time;
}
  
// Driver code
int main()
{
    int box[] = { 10, 2, 16, 19 };
    int truck[] = { 29, 25 };
  
    int n = sizeof(box) / sizeof(int);
    int m = sizeof(truck) / sizeof(int);
  
    printf("%d", minTime(box, truck, n, m));
  
    return 0;
}


Java
// Java implementation of the approach
import java.util.Arrays;
  
class GFG
{
  
// Function that returns true if it is
// possible to transport all the boxes
// in the given amount of time
static boolean isPossible(int box[], int truck[],
                int n, int m, int min_time)
{
    int temp = 0;
    int count = 0;
  
    while (count < m)
    {
        for (int j = 0; j < min_time
                        && temp < n
                        && truck[count] >= box[temp];
            j += 2)
            temp++;
  
        count++;
    }
  
    // If all the boxes can be
    // transported in the given time
    if (temp == n)
        return true;
  
    // If all the boxes can't be
    // transported in the given time
    return false;
}
  
// Function to return the minimum time required
static int minTime(int box[], int truck[], int n, int m)
{
  
    // Sort the two arrays
    Arrays.sort(box);
    Arrays.sort(truck);
  
    int l = 0;
    int h = 2 * n;
  
    // Stores minimum time in which
    // all the boxes can be transported
    int min_time = 0;
  
    // Check for the minimum time in which
    // all the boxes can be transported
    while (l <= h) {
        int mid = (l + h) / 2;
  
        // If it is possible to transport all
        // the boxes in mid amount of time
        if (isPossible(box, truck, n, m, mid))
        {
            min_time = mid;
            h = mid - 1;
        }
        else
            l = mid + 1;
    }
  
    return min_time;
}
  
// Driver code
public static void main(String[] args)
{
    int box[] = { 10, 2, 16, 19 };
    int truck[] = { 29, 25 };
  
    int n = box.length;
    int m = truck.length;
  
    System.out.printf("%d", minTime(box, truck, n, m));
}
}
  
/* This code contributed by PrinciRaj1992 */


Python3
# Python3 implementation of the approach 
  
# Function that returns true if it is 
# possible to transport all the boxes 
# in the given amount of time 
def isPossible(box, truck, n, m, min_time) :
      
    temp = 0
    count = 0
  
    while (count < m) :
        j = 0
        while (j < min_time and temp < n and 
                    truck[count] >= box[temp] ):
            temp +=1
            j += 2
  
        count += 1
  
    # If all the boxes can be 
    # transported in the given time 
    if (temp == n) :
        return True
  
    # If all the boxes can't be 
    # transported in the given time 
    return False
  
# Function to return the minimum time required 
def minTime(box, truck, n, m) : 
  
    # Sort the two arrays 
    box.sort(); 
    truck.sort(); 
  
    l = 0
    h = 2 * n 
  
    # Stores minimum time in which 
    # all the boxes can be transported 
    min_time = 0
  
    # Check for the minimum time in which 
    # all the boxes can be transported 
    while (l <= h) :
        mid = (l + h) // 2
  
        # If it is possible to transport all 
        # the boxes in mid amount of time 
        if (isPossible(box, truck, n, m, mid)) :
            min_time = mid 
            h = mid - 1
      
        else :
              
            l = mid + 1
  
    return min_time
  
# Driver code 
if __name__ == "__main__" : 
  
    box = [ 10, 2, 16, 19 ] 
    truck = [ 29, 25 ] 
  
    n = len(box) 
    m = len(truck)
  
    print(minTime(box, truck, n, m))
      
# This code is contributed by Ryuga


C#
// C# implementation of the approach
using System;
      
class GFG
{
  
// Function that returns true if it is
// possible to transport all the boxes
// in the given amount of time
static bool isPossible(int []box, int []truck,
                int n, int m, int min_time)
{
    int temp = 0;
    int count = 0;
  
    while (count < m)
    {
        for (int j = 0; j < min_time
                        && temp < n
                        && truck[count] >= box[temp];
            j += 2)
            temp++;
  
        count++;
    }
  
    // If all the boxes can be
    // transported in the given time
    if (temp == n)
        return true;
  
    // If all the boxes can't be
    // transported in the given time
    return false;
}
  
// Function to return the minimum time required
static int minTime(int []box, int []truck, int n, int m)
{
  
    // Sort the two arrays
    Array.Sort(box);
    Array.Sort(truck);
  
    int l = 0;
    int h = 2 * n;
  
    // Stores minimum time in which
    // all the boxes can be transported
    int min_time = 0;
  
    // Check for the minimum time in which
    // all the boxes can be transported
    while (l <= h)
    {
        int mid = (l + h) / 2;
  
        // If it is possible to transport all
        // the boxes in mid amount of time
        if (isPossible(box, truck, n, m, mid))
        {
            min_time = mid;
            h = mid - 1;
        }
        else
            l = mid + 1;
    }
  
    return min_time;
}
  
// Driver code
public static void Main(String[] args)
{
    int[] box = { 10, 2, 16, 19 };
    int []truck = { 29, 25 };
  
    int n = box.Length;
    int m = truck.Length;
  
    Console.WriteLine("{0}", minTime(box, truck, n, m));
}
}
  
/* This code contributed by PrinciRaj1992 */


PHP
= $box[$temp];
            $j += 2)
            $temp++;
  
        $count++;
    }
  
    // If all the boxes can be
    // transported in the given time
    if ($temp == $n)
        return true;
  
    // If all the boxes can't be
    // transported in the given time
    return false;
}
  
// Function to return the minimum time required
function minTime( $box, $truck, $n, $m)
{
  
    // Sort the two arrays
    sort($box);
    sort($truck);
  
    $l = 0;
    $h = 2 * $n;
  
    // Stores minimum time in which
    // all the boxes can be transported
    $min_time = 0;
  
    // Check for the minimum time in which
    // all the boxes can be transported
    while ($l <= $h) {
        $mid = intdiv(($l + $h) , 2);
  
        // If it is possible to transport all
        // the boxes in mid amount of time
        if (isPossible($box, $truck, $n, $m, $mid)) 
        {
            $min_time = $mid;
            $h = $mid - 1;
        }
        else
            $l = $mid + 1;
    }
  
    return $min_time;
}
  
// Driver code
$box = array( 10, 2, 16, 19 );
$truck = array( 29, 25 );
  
$n = sizeof($box);
$m = sizeof($truck);
  
echo minTime($box, $truck, $n, $m);
  
  
// This code is contributed by ihritik
  
?>


输出:
3