particiona.cpp

// $Id$

/*
  COMIENZO DE DESCRIPCION

  Usando las operaciones del TAD lista, escribir una funci\'on
  {\tt void particiona (list<int> &L, int a)} la cual, dada una lista 
  de enteros {\tt L}, reemplace aquellos que son mayores que {\tt a}
  por una sucesi\'on de elementos menores o iguales que {\tt a} 
  pero manteniendo la suma total constante.
  [Ejercicio tomado en el Ex\'amen Final del 05/07/01]
  keywords: lista
  
  FIN DE DESCRIPCION
*/
// -----------------------------------------------------------------
/*
  Se propone el siguiente algoritmo: recorrer la lista y, cada vez 
  que se encuentra un elemento "x>a" suprimirlo y reemplazarlo por 
  "a" tantas veces como entren en "x" y finalmente el resto, por ejemplo,
  si x=7 y `a=2', entonces se debe reemplazar ese 7 por la secuencia
  `2,2,2,1'. En la lista final NO deben quedar elementos mayores que
  `a'.  Por ejemplo, si L=[2,5,2,6,4,1,9,6,3,2], entonces particiona
  (l,4) debe retornar L=[2,4,1,2,4,2,4,1,4,4,1,4,2,3,2];
*/
// -----------------------------------------------------------------
#include <list>
#include <iostream>
#include "./util.h"
using namespace std;

// -----------------------------------------------------------------
void particiona (list<int> &L, int a) {
  list <int>::iterator p;
  int x;
  p = L.begin();
  while (p != L.end()) {
    // Despues de cada ejecucion del cuerpo de este lazo
    // si      *p <= a entonces p queda apuntando al siguiente
    // pero si *p >  a entonces *p es descompuesto en una serie
    // valores  y p queda apuntando al elemento siguiente
    // de la secuencia 
    x=*p;
    if (x>a) {
      p=L.erase(p); // Eliminamos el elemento
      // Este lazo inserta tantos valores de a como entren en *p
      while (x>a) { 
        p=L.insert(p, a); 
        p++; 
        x=x-a; 
      } // end while
      // Inserta el resto (si es x > 0)
      if (x>0) {p=L.insert(p,x); p++;}}
    else 
      p++;
  } // end while
}

// -----------------------------------------------------------------
int main () {
  list<int> L;
  randl(L,10,5.0);
  cout << endl;
  cout << "antes de particionar: ";
  printl(L);
  particiona(L, 3);
  cout << endl;
  cout << "despues de particionar: ";
  printl(L);
  cout << endl;
  cout << "imprime en orden inverso: ";
  printl_inv(L);
  cout << endl;
  return 0;
}
// -----------------------------------------------------------------

Generated by GNU Enscript 1.6.6.