Organice una string binaria para obtener el valor máximo dentro de un rango de índices

Dada una string que consta de solo 0 y 1. Ahora tiene N rangos que no se cruzan L, R ( L <= R), más específicamente [L1, R1], [L2, R2], …, [LN, RN], ninguno de estos intervalos se superponen, formalmente, para cada i, j válido tal que i!=j, ya sea Ri<Lj o Rj<Li. 
La tarea es encontrar una permutación válida que contenga las dos condiciones siguientes simultáneamente:  

  1. La suma de los números entre todos los N rangos dados será el máximo.
  2. La string será lexicográficamente más grande. Una string 1100 es lexicográficamente más grande que la string 1001.

Ejemplos:  

Entrada 
11100 

2 3 
5 5 
Salida 
01101
Primero ponemos 1 en la posición 2 y 3 luego en 5 ya 
que no quedan 1, la string formada es 01101.
Entrada 
0000111

1 1 
1 2 
Salida 
1110000
En el ejemplo anterior, nosotros, Primero, coloque 1 en la primera y segunda posición, luego nos queda otro ‘1’. 
Entonces, lo usamos para maximizar la string lexicográficamente y lo colocamos en la tercera posición y, por lo tanto, la reorganización está completa.  

Acercarse  

  • Se da prioridad a hacer que el recuento de 1 entre todos los l y r sea máx. Contamos el número de 1 en la array y los almacenamos en una variable.
  • Después de tomar la entrada, actualizamos el rango de cada l y r por 1 para marcar la posición que se llenará con 1 primero.
  • Luego, tomamos la suma del prefijo de la array para obtener la posición donde fijar los 1 primero. Luego ejecutamos un ciclo en esa array de suma de prefijos desde la izquierda. Si obtenemos alguna posición con un valor mayor a 1, eso significa que tenemos un lr en ese índice. Continuamos poniendo 1 en esos índices hasta que la cuenta de 1 se vuelve cero.
  • Ahora, una vez finalizada la operación de maximización y si quedan algunos 1, entonces comenzamos la maximización lexicográfica. Nuevamente comenzamos un ciclo desde la izquierda de la array de suma de prefijos. Si encontramos un índice que tiene el valor 0 que indica que no hay lr que tenga ese índice, entonces ponemos un 1 en ese índice y así continuamos hasta que se llenan todos los 1 restantes.

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

C++

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
void arrange(string s)
{
    int cc = 0;
 
    // Storing the count of 1's in the string
    for (int i = 0; i < s.length(); i++)
    {
        if (s[i] == '1') cc++;
    }
 
    int a[s.length() + 1] = {0};
 
    // Query of l and r
    int qq[][2] = {{2, 3}, {5, 5}};
 
    int n = sizeof(qq) / sizeof(qq[0]);
    for (int i = 0; i < n; i++)
    {
        int l = qq[i][0], r = qq[i][1];
        l--, r--;
        a[l]++;
 
        // Applying range update technique.
        a[r + 1]--;
    }
 
    int len_a = sizeof(a) / sizeof(a[0]);
    for (int i = 1; i < len_a; i++)
    {
        // Taking prefix sum to get the range update values
        a[i] += a[i - 1];
    }
 
    // Final array which will store the arranged string
    int zz[s.length()] = {0};
 
    for (int i = 0; i < len_a - 1; i++)
    {
        if (a[i] > 0)
        {
            if (cc > 0)
            {
                zz[i] = 1;
                cc--;
            }
            else
                break;
        }
 
        if (cc == 0) break;
    }
 
    // if after maximizing the ranges any 1 is left
    // then we maximize the string lexicographically.
    if (cc > 0)
    {
        for (int i = 0; i < s.length(); i++)
        {
            if (zz[i] == 0)
            {
                zz[i] = 1;
                cc--;
            }
            if (cc == 0) break;
        }
    }
 
    for (int i = 0; i < s.length(); i++)
        cout << zz[i];
    cout << endl;
}
 
// Driver Code
int main()
{
    string str = "11100";
    arrange(str);
    return 0;
}
 
// This code is contributed by
// sanjeev2552

Java

// Java implementation of the approach
class GFG
{
 
static void arrange(String s)
{
    int cc = 0;
 
    // Storing the count of 1's in the String
    for (int i = 0; i < s.length(); i++)
    {
        if (s.charAt(i) == '1') cc++;
    }
 
    int []a = new int[s.length() + 1];
 
    // Query of l and r
    int qq[][] = {{2, 3}, {5, 5}};
 
    int n = qq.length;
    for (int i = 0; i < n; i++)
    {
        int l = qq[i][0], r = qq[i][1];
        l--; r--;
        a[l]++;
 
        // Applying range update technique.
        a[r + 1]--;
    }
 
    int len_a = a.length;
    for (int i = 1; i < len_a; i++)
    {
        // Taking prefix sum to get the range update values
        a[i] += a[i - 1];
    }
 
    // Final array which will store the arranged String
    int []zz = new int[s.length()];
 
    for (int i = 0; i < len_a - 1; i++)
    {
        if (a[i] > 0)
        {
            if (cc > 0)
            {
                zz[i] = 1;
                cc--;
            }
            else
                break;
        }
 
        if (cc == 0) break;
    }
 
    // if after maximizing the ranges any 1 is left
    // then we maximize the String lexicographically.
    if (cc > 0)
    {
        for (int i = 0; i < s.length(); i++)
        {
            if (zz[i] == 0)
            {
                zz[i] = 1;
                cc--;
            }
            if (cc == 0) break;
        }
    }
    for (int i = 0; i < s.length(); i++)
        System.out.print(zz[i]);
    System.out.println();
}
 
// Driver Code
public static void main(String[] args)
{
    String str = "11100";
    arrange(str);
}
}
 
// This code is contributed by Rajput-Ji

Python3

# Python implementation of the approach
def arrange(s):
    cc = 0
 
    # Storing the count of 1's in the string
    for i in range(len(s)):
        if(s[i]=="1"):
            cc+= 1
    a =[0]*(len(s)+1)
 
    # Query of l and r
    qq =[(2, 3), (5, 5)]
 
    n = len(qq)
    for i in range(n):
        l, r = qq[i][0], qq[i][1]
        l-= 1
        r-= 1
        a[l]+= 1
 
        # Applying range update technique.
        a[r + 1]-= 1
 
    for i in range(1, len(a)):
 
        # Taking prefix sum to get the range update values
        a[i]= a[i]+a[i-1]
 
    # Final array which will store the arranged string
    zz =[0]*len(s)
 
    for i in range(len(a)-1):
        if(a[i]>0):
            if(cc>0):
                zz[i]= 1
                cc-= 1
            else:
                break
        if(cc == 0):
            break
 
    # if after maximizing the ranges any 1 is left
    # then we maximize the string lexicographically.
    if(cc>0):
 
        for i in range(len(s)):
            if(zz[i]== 0):
                zz[i]= 1
                cc-= 1
            if(cc == 0):
                break
    print(*zz, sep ="")
 
str = "11100"
arrange(str)

C#

// C# implementation of the approach
using System;
 
class GFG
{
 
static void arrange(String s)
{
    int cc = 0;
 
    // Storing the count of 1's in the String
    for (int i = 0; i < s.Length; i++)
    {
        if (s[i] == '1') cc++;
    }
 
    int []a = new int[s.Length + 1];
 
    // Query of l and r
    int [,]qq = {{2, 3}, {5, 5}};
 
    int n = qq.GetLength(0);
    for (int i = 0; i < n; i++)
    {
        int l = qq[i, 0], r = qq[i, 1];
        l--; r--;
        a[l]++;
 
        // Applying range update technique.
        a[r + 1]--;
    }
 
    int len_a = a.Length;
    for (int i = 1; i < len_a; i++)
    {
        // Taking prefix sum to get the range update values
        a[i] += a[i - 1];
    }
 
    // Final array which will store the arranged String
    int []zz = new int[s.Length];
 
    for (int i = 0; i < len_a - 1; i++)
    {
        if (a[i] > 0)
        {
            if (cc > 0)
            {
                zz[i] = 1;
                cc--;
            }
            else
                break;
        }
 
        if (cc == 0) break;
    }
 
    // if after maximizing the ranges any 1 is left
    // then we maximize the String lexicographically.
    if (cc > 0)
    {
        for (int i = 0; i < s.Length; i++)
        {
            if (zz[i] == 0)
            {
                zz[i] = 1;
                cc--;
            }
            if (cc == 0) break;
        }
    }
    for (int i = 0; i < s.Length; i++)
        Console.Write(zz[i]);
    Console.WriteLine();
}
 
// Driver Code
public static void Main(String[] args)
{
    String str = "11100";
    arrange(str);
}
}
 
// This code is contributed by PrinciRaj1992

Javascript

<script>
 
// Javascript implementation of the approach
 
function arrange(s)
{
    var cc = 0;
 
    // Storing the count of 1's in the string
    for(var i = 0; i < s.length; i++)
    {
        if (s[i] == '1') cc++;
    }
 
    var a = Array(s.length+1).fill(0);
 
    // Query of l and r
    var qq = [[2, 3], [5, 5]];
 
    var n = qq.length;
    for (var i = 0; i < n; i++)
    {
        var l = qq[i][0], r = qq[i][1];
        l--, r--;
        a[l]++;
 
        // Applying range update technique.
        a[r + 1]--;
    }
 
    var len_a = a.length;
    for (var i = 1; i < len_a; i++)
    {
        // Taking prefix sum to get the range update values
        a[i] += a[i - 1];
    }
 
    // Final array which will store the arranged string
    var zz = Array(s.length).fill(0);
 
    for (var i = 0; i < len_a - 1; i++)
    {
        if (a[i] > 0)
        {
            if (cc > 0)
            {
                zz[i] = 1;
                cc--;
            }
            else
                break;
        }
 
        if (cc == 0) break;
    }
 
    // if after maximizing the ranges any 1 is left
    // then we maximize the string lexicographically.
    if (cc > 0)
    {
        for (var i = 0; i < s.length; i++)
        {
            if (zz[i] == 0)
            {
                zz[i] = 1;
                cc--;
            }
            if (cc == 0) break;
        }
    }
 
    for (var i = 0; i < s.length; i++)
        document.write( zz[i]);
    document.write("<br>");
}
 
// Driver Code
var str = "11100";
arrange(str);
 
 
</script>
Producción: 

01101

 

Publicación traducida automáticamente

Artículo escrito por indrajit1 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 *