Dado un conjunto S que consta de n números, encuentre la suma de la diferencia entre el último y el primer elemento de cada subconjunto. Encontramos el primer y último elemento de cada subconjunto manteniéndolos en el mismo orden en que aparecen en el conjunto de entrada S.
es decir, sumSetDiff(S) = ∑ (último(s) – primero(s)),
donde sum cubre todos los subconjuntos s de S.
Nota: los elementos del subconjunto deben estar en el mismo orden que en el conjunto S.
Ejemplos:
S = {5, 2, 9, 6}, n = 4 Subsets are: {5}, last(s)-first(s) = 0. {2}, last(s)-first(s) = 0. {9}, last(s)-first(s) = 0. {6}, last(s)-first(s) = 0. {5,2}, last(s)-first(s) = -3. {5,9}, last(s)-first(s) = 4. {5,6}, last(s)-first(s) = 1. {2,9}, last(s)-first(s) = 7. {2,6}, last(s)-first(s) = 4. {9,6}, last(s)-first(s) = -3. {5,2,9}, last(s)-first(s) = 4. {5,2,6}, last(s)-first(s) = 1. {5,9,6}, last(s)-first(s) = 1. {2,9,6}, last(s)-first(s) = 4. {5,2,9,6}, last(s)-first(s) = 1. Output = -3+4+1+7+4-3+4+1+1+4+1 = 21.
Una solución simple para este problema es encontrar la diferencia entre el último y el primer elemento para cada subconjunto s del conjunto S y generar la suma de todas estas diferencias. La complejidad del tiempo para este enfoque es O(2 n ).
Una solución eficiente para resolver el problema en la complejidad del tiempo lineal.
Tenemos un conjunto S que consta de n números, y necesitamos calcular la suma de la diferencia entre el último y el primer elemento de cada subconjunto de S, es decir,
sumSetDiff(S) = ∑ (último(s) – primero(s)) , donde sum cubre todos los subconjuntos s de S. De manera
equivalente,
sumSetDiff(S) = ∑ (último(s)) – ∑ (primero(s)),
En otras palabras, podemos calcular la suma del último elemento de cada subconjunto, y la suma del primer elemento de cada subconjunto por separado, y luego calcular su diferencia.
Digamos que los elementos de S son {a1, a2, a3,…, an}. Tenga en cuenta la siguiente observación:
- Los subconjuntos que contienen el elemento a1 como primer elemento se pueden obtener tomando cualquier subconjunto de {a2, a3,…, an} y luego incluyendo a1 en él. El número de tales subconjuntos será 2 n-1 .
- Los subconjuntos que contienen el elemento a2 como primer elemento se pueden obtener tomando cualquier subconjunto de {a3, a4,…, an} y luego incluyendo a2 en él. El número de tales subconjuntos será 2 n-2 .
- Los subconjuntos que contienen el elemento ai como primer elemento se pueden obtener tomando cualquier subconjunto de {ai, a(i+1),…, an} y luego incluyendo ai en él. El número de dichos subconjuntos será 2 n-i .
Por tanto, la suma del primer elemento de todos los subconjuntos será:
SumF = a1.2 n-1 + a2.2 n-2 +…+ an.1
De manera similar, podemos calcular la suma del último elemento de todos los subconjuntos de S (Tomando en cada paso ai como último elemento en lugar de primer elemento y luego obteniendo todos los subconjuntos).
SumaL = a1.1 + a2.2 +…+ an.2 n-1
Finalmente, la respuesta de nuestro problema será SumL – SumF .
Implementación:
C++
// A C++ program to find sum of difference between // last and first element of each subset #include<bits/stdc++.h> // Returns the sum of first elements of all subsets int SumF( int S[], int n) { int sum = 0; // Compute the SumF as given in the above explanation for ( int i = 0; i < n; i++) sum = sum + (S[i] * pow (2, n-i-1)); return sum; } // Returns the sum of last elements of all subsets int SumL( int S[], int n) { int sum = 0; // Compute the SumL as given in the above explanation for ( int i = 0; i < n; i++) sum = sum + (S[i] * pow (2, i)); return sum; } // Returns the difference between sum of last elements of // each subset and the sum of first elements of each subset int sumSetDiff( int S[], int n) { return SumL(S, n) - SumF(S, n); } // Driver program to test above function int main() { int n = 4; int S[] = {5, 2, 9, 6}; printf ( "%d\n" , sumSetDiff(S, n)); return 0; } |
Java
// A Java program to find sum of difference // between last and first element of each // subset class GFG { // Returns the sum of first elements // of all subsets static int SumF( int S[], int n) { int sum = 0 ; // Compute the SumF as given in // the above explanation for ( int i = 0 ; i < n; i++) sum = sum + ( int )(S[i] * Math.pow( 2 , n - i - 1 )); return sum; } // Returns the sum of last elements // of all subsets static int SumL( int S[], int n) { int sum = 0 ; // Compute the SumL as given in // the above explanation for ( int i = 0 ; i < n; i++) sum = sum + ( int )(S[i] * Math.pow( 2 , i)); return sum; } // Returns the difference between sum // of last elements of each subset and // the sum of first elements of each // subset static int sumSetDiff( int S[], int n) { return SumL(S, n) - SumF(S, n); } // Driver program public static void main(String arg[]) { int n = 4 ; int S[] = { 5 , 2 , 9 , 6 }; System.out.println(sumSetDiff(S, n)); } } // This code is contributed by Anant Agarwal. |
Python3
# Python3 program to find sum of # difference between last and # first element of each subset # Returns the sum of first # elements of all subsets def SumF(S, n): sum = 0 # Compute the SumF as given # in the above explanation for i in range (n): sum = sum + (S[i] * pow ( 2 , n - i - 1 )) return sum # Returns the sum of last # elements of all subsets def SumL(S, n): sum = 0 # Compute the SumL as given # in the above explanation for i in range (n): sum = sum + (S[i] * pow ( 2 , i)) return sum # Returns the difference between sum # of last elements of each subset and # the sum of first elements of each subset def sumSetDiff(S, n): return SumL(S, n) - SumF(S, n) # Driver program n = 4 S = [ 5 , 2 , 9 , 6 ] print (sumSetDiff(S, n)) # This code is contributed by Anant Agarwal. |
C#
// A C# program to find sum of difference // between last and first element of each // subset using System; class GFG { // Returns the sum of first elements // of all subsets static int SumF( int []S, int n) { int sum = 0; // Compute the SumF as given in // the above explanation for ( int i = 0; i < n; i++) sum = sum + ( int )(S[i] * Math.Pow(2, n - i - 1)); return sum; } // Returns the sum of last elements // of all subsets static int SumL( int []S, int n) { int sum = 0; // Compute the SumL as given in // the above explanation for ( int i = 0; i < n; i++) sum = sum + ( int )(S[i] * Math.Pow(2, i)); return sum; } // Returns the difference between sum // of last elements of each subset and // the sum of first elements of each // subset static int sumSetDiff( int []S, int n) { return SumL(S, n) - SumF(S, n); } // Driver program public static void Main() { int n = 4; int []S = { 5, 2, 9, 6 }; Console.Write(sumSetDiff(S, n)); } } // This code is contributed by nitin mittal. |
PHP
<?php // A PHP program to find sum // of difference between last // and first element of each subset // Returns the sum of first // elements of all subsets function SumF( $S , $n ) { $sum = 0; // Compute the SumF as given // in the above explanation for ( $i = 0; $i < $n ; $i ++) $sum = $sum + ( $S [ $i ] * pow(2, $n - $i - 1)); return $sum ; } // Returns the sum of last // elements of all subsets function SumL( $S , $n ) { $sum = 0; // Compute the SumL as given // in the above explanation for ( $i = 0; $i < $n ; $i ++) $sum = $sum + ( $S [ $i ] * pow(2, $i )); return $sum ; } // Returns the difference between // sum of last elements of // each subset and the sum of // first elements of each subset function sumSetDiff( $S , $n ) { return SumL( $S , $n ) - SumF( $S , $n ); } // Driver Code $n = 4; $S = array (5, 2, 9, 6); echo sumSetDiff( $S , $n ); // This code is contributed by anuj_67. ?> |
Producción:
21
Complejidad de tiempo : O(n)
Este artículo es una contribución de Akash Aggarwal . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA