tplr20181122.cpp
#define USECHRONO
#undef HAVE_MPI
#include "eval.hpp"
#include <cassert>
#include <climits>
#include <cstdlib>
#include <stack>
#include <map>
using namespace aed;
using namespace std;
/* COMIENZO DE DESCRIPCION
__USE_WIKI__
#tree_less:#
Queremos escribir una funcion predicado #bool tree_less(tree<int> &T1,tree<int> &T2);# que sea
una relacion de orden fuerte para AOO. Debe retornar #true# si #T1<T2.# Recordemos que una relacion de
orden fuerte debe ser transitiva y tambien debe satisfacer que si #T1<T2# y #T2<T1# son falsos debe ser
#T1=T2.#
#xcommon:#
Implemente una funcion #void xcommon(list<int> &L1,list<int> &L2,list<int> &Lcommon);# tal que
dadas dos listas #L1# y #L2# extraiga la parte comun del comienzo de #Lcommon,# de tal forma que
#L2=(Lcommon,Ltail1)# y #L2=(Lcommon,Ltail2).# Adicionalmente, los argumentos #L1,# #L2# deben quedar
con las ”colas” correspondientes #Ltail1# y #Ltail2.#
#xsubtrees:#
Implemente la funcion void #xsubtrees(btree<int> &T, int depth, list<btree<int>> &Lout);#
que dado un arbol binario #T# y un entero #depth# extraer del arbol #T# todos los subarboles de nodos que
esten a profundidad #depth# (moverlos hacia la lista de subarboles #Lout# ).
#maxsubK:#
Escriba una funcion #int maxsubk(set<int> &S, int k);# que devuelva la maxima suma en valor absoluto
de todos los subconjuntos posibles del conjunto #S# tomados de a #k.#
#num-path:# Escriba una funcion
#int num_path(map<int,set<int>>& G, int i, int j);# que
retorne el numero de caminos (sin ciclos) en el grafo no
dirigido #G,# partiendo desde el vertice #i# y
finalizando en el vertice #j.# Se garantiza que los nodos
#i# y #j# estan en el grafo.
#super-stable-partition:# Escribir una funcion
#super_stable_partition# que reciba una lista con enteros
#L# y dos listas vacias #L_low# y #L_geq,# determine si
existe alguna posicion para particionar la lista en dos
sublistas segun el valor de dicha posicion, sin
reordenarla. Es decir, debe encontrar una posicion tal
que todos los elementos previos a la misma sean menores
al valor que hay en dicha posicion, y todos los elementos
posteriores sean mayores o iguales. Si existe tal
posicion (si hay mas de una, tome la primera en la
secuencia), mueva (splice) ambas partes a las listas
#L_low# (menores) y #L_geq# (mayores o iguales) y retorne
#true;# si no existe retorne #false.#
[Tomado en el Recuperatorio de TPLs de 2018-11-22].
keywords: lista, correspondencia, arbol binario, arbol orientado,conjunto
FIN DE DESCRIPCION */
typedef tree<int>::iterator node_t;
bool tree_less(tree<int> &T1,node_t n1,tree<int> &T2,node_t n2) {
// Si los valores en n1 y n2 no son iguales ya esta
if (*n1<*n2) return true;
if (*n1>*n2) return false;
// Chequeamos los hijos hasta encontrar uno distinto
node_t c1=n1.lchild(), c2=n2.lchild();
while (c1!=T1.end() && c2!=T2.end()) {
if (tree_less(T1,c1,T2,c2)) return true;
if (tree_less(T2,c2,T1,c1)) return false;
c1++; c2++;
}
// Hast ahora son todos iguales pero se acabo una de las
// listas de hijos. Si hay mas hijos en la lista te T2
// entonces quiere decir que T1<T2. Si hay en T1 o no hay
// en ninguno de los dos entonces hay que retornar false.
return c2!=T2.end();
}
bool tree_less(tree<int> &T1,tree<int> &T2) {
// El arbol vacio es -INF o sea que nadie puede ser menor que el
// Si T2 es vacio no puede ser T1<T2
if (T2.empty()) return false;
// Si T1 es vacio y ya sabemos que T2 no es vacio => T1 es
// menor que T2
if (T1.empty()) return true;
// Aplicar la funcion recursiva, a partir de ahora los
// arboles llamados nunca son vacios
return tree_less(T1,T1.begin(),T2,T2.begin());
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void xcommon(list<int> &L1,list<int> &L2,list<int> &Lcommon) {
Lcommon.clear();
auto q1=L1.begin(), q2=L2.begin();
while (q1!=L1.end() && q2!=L2.end()) {
if (*q1!=*q2) break;
Lcommon.push_back(*q1);
q1 = L1.erase(q1);
q2 = L2.erase(q2);
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
typedef btree<int>::iterator bnode_t;
void xsubtrees(btree<int> &T,bnode_t n,int depth,
list< btree<int> > &subtrees) {
if (n==T.end()) return;
if (depth==0) {
btree<int> tmp;
T.splice(tmp.begin(),n);
subtrees.push_back(tmp);
} else {
xsubtrees(T,n.left(),depth-1,subtrees);
xsubtrees(T,n.right(),depth-1,subtrees);
}
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
void xsubtrees(btree<int> &T, int depth,
list< btree<int> > &subtrees) {
subtrees.clear();
xsubtrees(T,T.begin(),depth,subtrees);
}
int suma_set(set<int> S){
int suma = 0;
for(auto x:S){suma += abs(x);}
return suma;
}
int maxSubk(set<int> S, int k, set<int> Sk){
if(k==0) return suma_set(Sk);
if(S.empty()) return -1;
int elem = *S.begin();
S.erase(S.begin());
int suma_sin = maxSubk(S,k,Sk);
Sk.insert(elem);
int suma_con = maxSubk(S,k-1,Sk);
return (suma_sin>suma_con) ? suma_sin : suma_con;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int maxSubk(set<int> S, int k){
return maxSubk(S,k,{});
}
void num_path(map<int,set<int>>& G, int i, int j,
int &npath, set<int> visitados) {
visitados.insert(i);
if(i==j) npath++;
set<int> vecinos = G[i];
for(int v:vecinos){
if(!visitados.count(v)){
num_path(G, v, j, npath, visitados);
}
}
}
int num_path(map<int,set<int>>& G, int i, int j){
int npath = 0;
set<int> visitados;
num_path(G, i, j, npath, visitados);
return npath;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int is_valid(list<int> &L, list<int>::iterator p) {
for(auto it=L.begin();it!=p;++it)
if (*it>=*p) return false;
for(auto it=p;it!=L.end();++it)
if (*it<*p) return false;
return true;
}
bool super_stable_partition(list<int> &L,
list<int> &L_low,
list<int> &L_geq) {
for(auto it=L.begin();it!=L.end();++it) {
if (is_valid(L,it)) {
L_low.splice(L_low.begin(),L,L.begin(),it);
L_geq.splice(L_geq.begin(),L,L.begin(),L.end());
return true;
}
}
return false;
}
//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
Eval ev;
int vrbs = 0;
int seed = 123;
int h1=0,h2=0,h3=0,h4=0,h5=0,h6=0;
do {
// Check a specific task
ev.eval<1>(tree_less,vrbs);
h1 = ev.evalr<1>(tree_less,seed,vrbs);
ev.eval<2>(xcommon,vrbs);
h2 = ev.evalr<2>(xcommon,seed,vrbs);
ev.eval<3>(xsubtrees,vrbs);
h3 = ev.evalr<3>(xsubtrees,seed,vrbs);
ev.eval<4>(maxsubk,vrbs);
h4 = ev.evalr<4>(maxsubk,seed,vrbs);
ev.eval<5>(num_path,vrbs);
h5 = ev.evalr<5>(num_path,seed,vrbs);
ev.eval<6>(super_stable_partition,vrbs);
h6 = ev.evalr<6>(super_stable_partition,seed,vrbs);
printf("S=%03d -> H1=%03d H2=%03d H3=%03d H4=%03d H5=%03d H6=%03d\n",
seed,h1,h2,h3,h4,h5,h6);
printf("\n\nIngrese un valor para la semilla:");
} while (cin>>seed);
return 0;
}
Generated by GNU Enscript 1.6.6.