📜  每次取下最小的绳索后都剩下的绳索

📅  最后修改于: 2021-05-04 09:44:27             🧑  作者: Mango

给定一个大小为整数的数组,N个。数组包含N条长度为Ropes [i]的绳索。您必须对绳索执行切割操作,以使所有绳索均减小最小绳索的长度。显示每次切割后剩余的绳索数量。进行操作,直到每条绳索的长度变为零。
注意:如果在一次操作后没有剩余绳索,那么在这种情况下,我们将打印0。

例子:

一个简单的解决方案是遍历[0…n-1]的循环。在每次迭代中,我们首先找到最小长度的绳索。之后,我们将所有的绳索长度减少,然后计算剩下的长度大于零的绳索。一直执行此过程,直到所有绳索长度都大于零为止。此解决方案需要O(n 2 )时间。

有效的解决方案适用于O(nlog(n))。首先,我们必须按照长度的增加顺序对所有绳索进行排序。之后,我们将按照步骤进行操作。

//initial cutting length "min rope"  
CuttingLength = Ropes[0]
Now Traverse a loop from left to right [1...n]
 .During traverse we check that 
  is current ropes length is greater than zero or not 
 IF ( Ropes[i] - CuttingLength > 0 ) 
 .... IF Yes then all ropes to it's right side also greater than 0
 .... Print number of ropes remains (n - i)
 ....update Cutting Length by current rope length
 ...... CuttingLength = Ropes[i]          
Do the same process for the rest.

以下是上述想法的实现。

C++
// C++ program to print how many
// Ropes are Left After Every Cut
#include 
using namespace std;
 
// Function print how many Ropes are
// Left AfterEvery Cutting operation
void cuttringRopes(int Ropes[], int n)
{
    // sort all Ropes in increase
    // of there length
    sort(Ropes, Ropes + n);
 
    int singleOperation = 0;
 
    // min length rope
    int cuttingLenght = Ropes[0];
 
    // now traverse through the given
    // Ropes in increase order of length
    for (int i = 1; i < n; i++)
    {
        // After cutting if current rope length
        // is greater than '0' that mean all
        // ropes to it's right side are also
        // greater than 0
        if (Ropes[i] - cuttingLenght > 0)
        {
            // print number of ropes remains
            cout << (n - i) << " ";
             
            // now current rope become
            // min length rope
            cuttingLenght = Ropes[i];
            singleOperation++;
        }
    }
    if (singleOperation == 0)
        cout << "0 ";
}
int main()
{
    int Ropes[] = { 5, 1, 1, 2, 3, 5 };
    int n = sizeof(Ropes) / sizeof(Ropes[0]);
    cuttringRopes(Ropes, n);
    return 0;
}


Java
// Java program to print how many
// Ropes are Left After Every Cut
import java.util.*;
import java.lang.*;
import java.io.*;
 
class GFG {
     
    // function print how many Ropes are Left After
    // Every Cutting operation
    public static void cuttringRopes(int Ropes[], int n)
    {
        // sort all Ropes in increasing
        // order of their length
        Arrays.sort(Ropes);
 
        int singleOperation = 0;
 
        // min length rope
        int cuttingLenght = Ropes[0];
 
        // now traverse through the given Ropes in
        // increase order of length
        for (int i = 1; i < n; i++)
        {
            // After cutting if current rope length
            // is greater than '0' that mean all
            // ropes to it's right side are also
            // greater than 0
            if (Ropes[i] - cuttingLenght > 0)
            {
                System.out.print(n - i + " ");
                 
                // now current rope become
                // min length rope
                cuttingLenght = Ropes[i];
 
                singleOperation++;
            }
        }
         
        // after first operation all ropes
        // length become zero
        if (singleOperation == 0)
            System.out.print("0");
    }
 
    public static void main(String[] arg)
    {
        int[] Ropes = { 5, 1, 1, 2, 3, 5 };
        int n = Ropes.length;
        cuttringRopes(Ropes, n);
    }
}
Python3 # Python 3 program to
# print how many
# Ropes are Left After
# Every Cut

# Function print how many Ropes are 
# Left AfterEvery Cutting operation
def cuttringRopes(Ropes, n) :

    # sort all Ropes in increase 
    # of there length
    Ropes.sort()
 
    singleOperation = 0
 
    # min length rope
    cuttingLenght = Ropes[0]
 
    # now traverse through the given
    # Ropes in increase order of length
    for i in range(1,n) :

        # After cutting if current rope length
        # is greater than '0' that mean all
        # ropes to it's right side are also 
        # greater than 0
        if (Ropes[i] - cuttingLenght > 0) :

            # print number of ropes remains
            print((n - i) ,end= " ")
             
            # now current rope become
            # min length rope
            cuttingLenght = Ropes[i]
            singleOperation = singleOperation + 1
        
        
    if (singleOperation == 0) :
        print("0 ",end="")


Ropes = [ 5, 1, 1, 2, 3, 5 ]
n = len(Ropes)
cuttringRopes(Ropes, n)



# This code is contributed by Nikita Tiwari.


C#
// C# program to print how many
// Ropes are Left After Every Cut
using System;
 
class GFG {
     
    // function print how many Ropes are Left After
    // Every Cutting operation
    public static void cuttringRopes(int []Ropes, int n)
    {
        // sort all Ropes in increasing
        // order of their length
        Array.Sort(Ropes);
 
        int singleOperation = 0;
 
        // min length rope
        int cuttingLenght = Ropes[0];
 
        // now traverse through the given Ropes in
        // increase order of length
        for (int i = 1; i < n; i++)
        {
            // After cutting if current rope length
            // is greater than '0' that mean all
            // ropes to it's right side are also
            // greater than 0
            if (Ropes[i] - cuttingLenght > 0)
            {
                Console.Write(n - i + " ");
                 
                // now current rope become
                // min length rope
                cuttingLenght = Ropes[i];
 
                singleOperation++;
            }
        }
         
        // after first operation all ropes
        // length become zero
        if (singleOperation == 0)
            Console.Write("0");
    }
 
    // Driver code
    public static void Main()
    {
        int[] Ropes = { 5, 1, 1, 2, 3, 5 };
        int n = Ropes.Length;
        cuttringRopes(Ropes, n);
    }
}
 
// This code is contributed by vt_m.


PHP
 0)
        {
            // print number of ropes remains
            echo ($n - $i). " ";
             
            // now current rope become
            // min length rope
            $cuttingLenght = $Ropes[$i];
            $singleOperation++;
        }
    }
    if ($singleOperation == 0)
        echo "0 ";
}
 
    // Driver Code
    $Ropes = array(5, 1, 1, 2, 3, 5);
    $n = count($Ropes);
    cuttringRopes($Ropes, $n);
 
// This code is contributed by Sam007
?>


Javascript


4 3 2 

时间复杂度:O(n long(n))
空间复杂度:O(1)