Maximice las celdas ocupadas en Matrix dada satisfaciendo las condiciones

Dada una array de dimensión N*M , la tarea es maximizar el número total de celdas ocupadas en la array dada de modo que sigan la condición dada:

  • Si dos celdas están ocupadas en la misma fila, debe haber al menos una celda vacía entre ellas.
  • Si dos celdas están ocupadas en filas diferentes, debe haber al menos una fila completamente vacía entre ellas, 
    es decir, si las celdas en la i- ésima y j- ésima fila están ocupadas de manera que i < j , entonces debe haber una k-ésima fila completamente vacía de modo que i < k < j .

Ejemplos:

Entrada: N = 1 ,M = 5
Salida: 3
Explicación: Solo hay una fila con cinco asientos. 
Se pueden ocupar un máximo de tres celdas. 
Consulte la tabla a continuación, donde 1 indica una celda ocupada.

1   1   1

Entrada: N = 3 ,M = 3
Salida: 4
Explicación:  Hay tres filas con tres asientos cada una.
El máximo de celdas ocupadas puede ser 4.

1   1
     
1   1
 

Enfoque ingenuo: el problema se puede resolver utilizando un enfoque codicioso . Comience a llenar desde la primera fila y la primera columna y mantenga un espacio de 1 entre dos celdas ocupadas de una fila y un espacio de una fila entre dos celdas ocupadas de filas diferentes.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find
// maximum number of occupied cells
int solve(int N, int M)
{
    int ans = 0;
    while (1) {
        // Count number of occupied cells
        // in one row
        for (int i = 1; i <= M; i += 2) {
            ans++;
        }
        // If row numbers to be filled
        // are greater than or equal to 2
        // decrease by 2 otherwise decrease by 1
        // and if number of rows to be filled
        // are 0 return ans
        if (N >= 2) {
            N--;
            N--;
        }
        else if (N == 1) {
            N--;
        }
        if (N == 0) {
            break;
        }
    }
   
    // Return number of occupied cells
    return ans;
}
 
// Driver code
int main()
{
    int N = 1;
    int M = 5;
    cout << solve(N, M);
    return 0;
}

Java

// Java program for the above approach
import java.util.*;
public class GFG
{
 
  // Function to find
  // maximum number of occupied cells
  static int solve(int N, int M)
  {
    int ans = 0;
    while (true)
    {
 
      // Count number of occupied cells
      // in one row
      for (int i = 1; i <= M; i += 2) {
        ans++;
      }
 
      // If row numbers to be filled
      // are greater than or equal to 2
      // decrease by 2 otherwise decrease by 1
      // and if number of rows to be filled
      // are 0 return ans
      if (N >= 2) {
        N--;
        N--;
      }
      else if (N == 1) {
        N--;
      }
      if (N == 0) {
        break;
      }
    }
 
    // Return number of occupied cells
    return ans;
  }
 
  // Driver code
  public static void main(String[] args)
  {
    int N = 1;
    int M = 5;
    System.out.print(solve(N, M));
  }
}
 
// This code is contributed by Samim Hossain Mondal

Python3

# Python program for the above approach
 
# Function to find
# maximum number of occupied cells
def solve(N, M):
    ans = 0;
    while (1):
     
        # Count number of occupied cells
        # in one row
        for i in range(1, M + 1, 2):
            ans += 1
         
        # If row numbers to be filled
        # are greater than or equal to 2
        # decrease by 2 otherwise decrease by 1
        # and if number of rows to be filled
        # are 0 return ans
        if (N >= 2):
            N -= 1
            N -= 1
        elif (N == 1):
            N -= 1
        if (N == 0):
            break
   
    # Return number of occupied cells
    return ans;
 
# Driver code
N = 1;
M = 5;
print(solve(N, M));
 
# This code is contributed by saurabh_jaiswal.

C#

// C# program for the above approach
using System;
class GFG {
 
  // Function to find
  // maximum number of occupied cells
  static int solve(int N, int M)
  {
    int ans = 0;
    while (true)
    {
 
      // Count number of occupied cells
      // in one row
      for (int i = 1; i <= M; i += 2) {
        ans++;
      }
 
      // If row numbers to be filled
      // are greater than or equal to 2
      // decrease by 2 otherwise decrease by 1
      // and if number of rows to be filled
      // are 0 return ans
      if (N >= 2) {
        N--;
        N--;
      }
      else if (N == 1) {
        N--;
      }
      if (N == 0) {
        break;
      }
    }
 
    // Return number of occupied cells
    return ans;
  }
 
  // Driver code
  public static void Main()
  {
    int N = 1;
    int M = 5;
    Console.Write(solve(N, M));
  }
}
 
// This code is contributed by ukasp.

Javascript

<script>
// Javascript program for the above approach
 
// Function to find
// maximum number of occupied cells
function solve(N, M)
{
    let ans = 0;
    while (1)
    {
     
        // Count number of occupied cells
        // in one row
        for (let i = 1; i <= M; i += 2) {
            ans++;
        }
         
        // If row numbers to be filled
        // are greater than or equal to 2
        // decrease by 2 otherwise decrease by 1
        // and if number of rows to be filled
        // are 0 return ans
        if (N >= 2) {
            N--;
            N--;
        }
        else if (N == 1) {
            N--;
        }
        if (N == 0) {
            break;
        }
    }
   
    // Return number of occupied cells
    return ans;
}
 
// Driver code
let N = 1;
let M = 5;
document.write(solve(N, M));
 
// This code is contributed by saurabh_jaiswal.
</script>
Producción

3

Complejidad de Tiempo: O(N*M)
Espacio Auxiliar: O(1), ya que no se ha tomado espacio extra.

Enfoque eficiente: para maximizar el número total de celdas ocupadas, deben ocuparse de la manera mencionada anteriormente. El número total se puede obtener de la siguiente observación:

Entonces, el número máximo de celdas que se pueden ocupar para cada fila es ceil(M/2) .
Y como hay un espacio de una fila entre dos celdas ocupadas de filas diferentes, 
el número máximo de filas que se pueden ocupar es ceil(N/2) .
Por lo tanto , el número máximo de celdas que se pueden ocupar es ceil(M/2) * ceil(N/2) .

A continuación se muestra la implementación del enfoque anterior.

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find
// maximum number of occupied cells
int solve(int N, int M)
{
    int x = (M + 1) / 2;
    int y = (N + 1) / 2;
    int ans = x * y;
 
    // Return number of occupied cells
    return ans;
}
 
// Driver code
int main()
{
    int N = 1;
    int M = 5;
    cout << solve(N, M);
    return 0;
}

Java

// Java program for the above approach
import java.io.*;
class GFG
{
 
  // Function to find
  // maximum number of occupied cells
  public static int solve(int N, int M)
  {
    int x = (M + 1) / 2;
    int y = (N + 1) / 2;
    int ans = x * y;
 
    // Return number of occupied cells
    return ans;
  }
 
  // Driver code
  public static void main (String[] args)
  {
    int N = 1;
    int M = 5;
    System.out.print(solve(N, M));
  }
}
 
// This code is contributed by Shubham Singh

Python3

# Python program for the above approach
 
# Function to find
# maximum number of occupied cells
def solve (N, M):
    x = (M + 1) // 2
    y = (N + 1) // 2
    ans = x * y
     
    # Return number of occupied cells
    return ans
     
# Driver code
N = 1
M = 5
print(solve(N, M));
 
# This code is contributed by Shubham Singh

C#

// C# program for the above approach
using System;
public class GFG
{
 
  // Function to find
  // maximum number of occupied cells
  public static int solve(int N, int M)
  {
    int x = (M + 1) / 2;
    int y = (N + 1) / 2;
    int ans = x * y;
 
    // Return number of occupied cells
    return ans;
  }
 
  // Driver code
  public static void Main(String[] args)
  {
    int N = 1;
    int M = 5;
    Console.Write(solve(N, M));
  }
}
 
// This code is contributed by shikhasingrajput

Javascript

<script>
        // JavaScript program for the above approach
 
        // Function to find
        // maximum number of occupied cells
        const solve = (N, M) => {
            let x = parseInt((M + 1) / 2);
            let y = parseInt((N + 1) / 2);
            let ans = x * y;
 
            // Return number of occupied cells
            return ans;
        }
 
        // Driver code
 
        let N = 1;
        let M = 5;
        document.write(solve(N, M));
 
    // This code is contributed by rakeshsahni
 
    </script>
Producción

3

Tiempo Complejidad: O(1)
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por sauarbhyadav y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *