expand.cpp
// $Id$
/*
COMIENZO DE DESCRIPCION
__USE_WIKI__
Escribir una funcion
#void expand(list<int> &L,int m);#
que transforma los elementos de una lista #L# de tal
forma que todos los elementos de #L# resulten ser menores o igual
que #m#, pero de tal forma que su suma se mantenga inalterada.
[Tomado en primer parcial 2011-09-15].
keywords: lista
FIN DE DESCRIPCION
*/
// Para esto, si un elemento !+x+ es mayor que !+m+
// entonces, lo divide en tantas partes como haga falta
// para satisfacer la condicion; por ejemplo si !+m=3+
// podemos dividir a !+10+ en !+3,3,3,1+. Es decir si
// !+L=(7,2,3,1,4,5)+, entonces despues de hacer
// !+expand(L,2)+ debe quedar
// !+L=(2,2,2,1,2,2,1,1,2,2,2,2,1)+.
// -----------------------------------------------------------------
#include <cassert>
#include <cstdio>
#include <cmath>
#include <vector>
#include <set>
#include "./util.h"
using namespace std ;
void expand(list<int> &L,int m) {
list<int>::iterator p = L.begin();
while (p!=L.end()) {
int x = *p;
p = L.erase(p);
while (x>0) {
int val = (x>m ? m : x);
p = L.insert(p,val);
x -= val;
p++;
}
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
for (int k=0; k<10; k++) {
list<int> L;
for (int j=0; j<10; j++) L.insert(L.end(),rand()%10);
int m = rand()%5 + 3; // m va entre 3 y 7
printf("Before expand:\n");;
printl(L);
expand(L,m);
printf("After expand(L,%d):\n---------\n",m);
printl(L);
}
return 0;
}
Generated by GNU Enscript 1.6.6.