Dados cuatro números enteros N , M , X e Y , la tarea es construir una array N * M tal que cada celda consista en un valor en el rango [0, X] tal que la suma de dos celdas adyacentes cualesquiera sea menor que o igual a Y y la suma total de la array debe ser máxima.
Ejemplo:
Entrada: N = 3, M = 3, X = 5, Y = 3
Salida:
3 0 3
0 3 0
3 0 3
Explicación:
Todos los valores de la array están entre 0 y 5.
La suma de dos celdas adyacentes es igual a 3.
La suma total de la array es 15, que es el máximo posible.Entrada: N = 3, M = 3, X = 3, Y = 5
Salida:
3 2 3
2 3 2
3 2 3
Enfoque:
siga los pasos a continuación para resolver el problema:
- Para satisfacer las dos condiciones necesarias, la array debe llenarse alternativamente con solo los dos números siguientes:
Primer número = mínimo (X, Y)
Segundo número = mínimo (2X, Y) –
Ilustración del primer número:
N = 3, M = 3, X = 5, Y = 3
Primer número = Mínimo (X, Y) = Mínimo ( 5, 3) = 3
Segundo número = Mínimo (2X, Y) – 3 = Mínimo (10, 3) – 3 = 3 – 3 = 0
Por lo tanto, la suma de dos celdas adyacentes = 3 + 0 = 3 (= Y)
- Finalmente, imprima los dos números alternativamente, el primer número seguido del segundo número para maximizar la suma de la array.
A continuación se muestra la implementación del enfoque anterior.
C++
// C++ implementation of // the above approach #include <iostream> using namespace std; // Function to print the // required matrix void FindMatrix(int n, int m, int x, int y) { int a, b, i, j; // For 1*1 matrix if (n * m == 1) { if (x > y) { cout << y << "\n"; } else { cout << x << "\n"; } return; } // Greater number a = min(x, y); // Smaller number b = min(2 * x, y) - a; // Sets/Resets for alternate // filling of the matrix bool flag = true; // Print the matrix for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (flag) cout << a << ' '; else cout << b << ' '; flag = !flag; } // If end of row is reached if (((n % 2 != 0 && m % 2 == 0) || (n % 2 == 0 && m % 2 == 0))) flag = !flag; cout << "\n"; } } // Driver Code int main() { int N, M, X, Y; N = 3; M = 3; X = 5; Y = 3; FindMatrix(N, M, X, Y); }
Java
// Java implementation of // the above approach class GFG{ // Function to print the // required matrix static void FindMatrix(int n, int m, int x, int y) { int a, b, i, j; // For 1*1 matrix if (n * m == 1) { if (x > y) { System.out.print(y + "\n"); } else { System.out.print(x + "\n"); } return; } // Greater number a = Math.min(x, y); // Smaller number b = Math.min(2 * x, y) - a; // Sets/Resets for alternate // filling of the matrix boolean flag = true; // Print the matrix for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (flag) System.out.print(a + " "); else System.out.print(b + " "); flag = !flag; } // If end of row is reached if (((n % 2 != 0 && m % 2 == 0) || (n % 2 == 0 && m % 2 == 0))) flag = !flag; System.out.print("\n"); } } // Driver Code public static void main(String[] args) { int N, M, X, Y; N = 3; M = 3; X = 5; Y = 3; FindMatrix(N, M, X, Y); } } // This code is contributed by gauravrajput1
Python3
# Python3 implementation of # the above approach # Function to print the # required matrix def FindMatrix(n, m, x, y): # For 1*1 matrix if (n * m == 1): if (x > y): print(y) else: print(x) return # Greater number a = min(x, y) # Smaller number b = min(2 * x, y) - a # Sets/Resets for alternate # filling of the matrix flag = True # Print the matrix for i in range(n): for j in range(m): if (flag): print(a, end = " ") else: print(b, end = " ") flag = not flag # If end of row is reached if (((n % 2 != 0 and m % 2 == 0) or (n % 2 == 0 and m % 2 == 0))): flag = not flag print () # Driver Code N = 3 M = 3 X = 5 Y = 3 FindMatrix(N, M, X, Y) # This code is contributed by chitranayal
C#
// C# implementation of // the above approach using System; class GFG{ // Function to print the // required matrix static void FindMatrix(int n, int m, int x, int y) { int a, b, i, j; // For 1*1 matrix if (n * m == 1) { if (x > y) { Console.Write(y + "\n"); } else { Console.Write(x + "\n"); } return; } // Greater number a = Math.Min(x, y); // Smaller number b = Math.Min(2 * x, y) - a; // Sets/Resets for alternate // filling of the matrix bool flag = true; // Print the matrix for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (flag) Console.Write(a + " "); else Console.Write(b + " "); flag = !flag; } // If end of row is reached if (((n % 2 != 0 && m % 2 == 0) || (n % 2 == 0 && m % 2 == 0))) flag = !flag; Console.Write("\n"); } } // Driver Code public static void Main(String[] args) { int N, M, X, Y; N = 3; M = 3; X = 5; Y = 3; FindMatrix(N, M, X, Y); } } // This code is contributed by Amit Katiyar
Javascript
<script> // Javascript implementation of // the above approach // Function to print the // required matrix function FindMatrix(n, m, x, y) { var a, b, i, j; // For 1*1 matrix if (n * m == 1) { if (x > y) { document.write(y); } else { document.write(x); } return; } // Greater number a = Math.min(x, y); // Smaller number b = Math.min(2 * x, y) - a; // Sets/Resets for alternate // filling of the matrix var flag = true; // Print the matrix for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (flag) document.write(a + " "); else document.write(b + " "); flag = !flag; } // If end of row is reached if (((n % 2 != 0 && m % 2 == 0) || (n % 2 == 0 && m % 2 == 0))) flag = !flag; document.write("<br>"); } } // Driver Code var N, M, X, Y; N = 3; M = 3; X = 5; Y = 3; FindMatrix(N, M, X, Y); // This code is contributed by Khushboogoyal499 </script>
3 0 3 0 3 0 3 0 3
Complejidad temporal: O(N * M)
Complejidad espacial: O(1)
Publicación traducida automáticamente
Artículo escrito por deepanshujindal634 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA