tpl1r20150912.cpp

#include "eval.hpp"
#include <climits>
#include <cstdlib>
#include <stack>

/* COMIENZO DE DESCRIPCION

   __USE_WIKI__

   #iscomb:# Dado un vector de listas #VL# y una lista
   #L#, determinar si #L# es una combinacion de las listas de #VL#
   en alguna permutacion dada. Cada una de las #VL[j]# debe aparecer
   una y solo una vez en #L#. 

   #max-sublist:# Escribir una funcion
   que recibe una lista de enteros y encuentra y retorna la
   sublista consecutiva que obtenga la mayor suma entre todos
   sus elementos. 

   #mergesort:# Programar una funcion void
   #mergesort(list<int> &L);# que ordane una lista #L#
   desordenada y la ordene en forma ascendente mediante una
   estrategia recursiva.

   [Tomado en el Recup Trabajo Practico de Laboratorio Nro 1
   (TPL1R) de 2015-09-12].  
   keywords: lista

FIN DE DESCRIPCION */

using namespace aed;
using namespace std;

list<int> mochila(list<int> &P,int K) {
  list<int> P1, M;
  if (K==0 || P.empty()) return M;

  // a0 es el primer elemento
  int a0 = P.front();
  // P1 es P sin el primer elemento
  P1 = P;
  P1.erase(P1.begin());

  list<int> M_cona0, M_sina0;
  M_sina0 = mochila(P1,K);
  if (a0>K) return M_sina0;
  
  M_cona0 = mochila(P1,K-a0);
  M_cona0.push_back(a0);

  if (M_sina0.size()>M_cona0.size()) 
    return M_sina0;
  else return M_cona0;
}

// busco el elemento x en L
bool encuentra_x (list <int> &L, int x) {
  list <int>::iterator it = L.begin();
  while (it != L.end()) if (*it++ == x) return true;
  return false;
}

bool enunosolo(list<list <int> > &LL, list<int> &L) {
  list <int>::iterator itL = L.begin();
  while (itL != L.end()) {
    list <list<int> >::iterator itLL = LL.begin();
    int count=0;
    while (itLL != LL.end()) {
      count += encuentra_x(*itLL++,*itL);
      if (count>1) return false;
    }
    if (count!=1) return false;
    itL++;
  }
  return true;
}

int ppt(list<int> &H, int n) {
  if (int(H.size())<n) return 0;

  list<int>::iterator q = H.end(); q--;
  list<int> aux;
  for (int j=0; j<n; j++)
    aux.insert(aux.begin(),*q--);
  list<int>::iterator p = H.begin();
  int nextplay = 0;
  while (p!=H.end()) {
    list<int>::iterator p2 = p++, q= aux.begin();
    while (p2!=H.end() && q!=aux.end() && *p2==*q) {
      p2++; q++;
    }
    if (q!=aux.end() || p2==H.end()) continue;
    nextplay = *p2;
  }
  return nextplay;
}

// VERSION 2
// Iterando al reves (desde end hacia begin)
int ppt2(list<int> &H, int n) {
  if (int(H.size())<n) return 0;

  list<int>::iterator q = H.end(); q--;
  list<int> aux;
  for (int j=0; j<n; j++)
    aux.insert(aux.begin(),*q--);
  list<int>::iterator p = H.begin();

  if (H.empty()) return 0;
  
  p = H.end(); p--;
  while (1) {
    list<int>::iterator p2 = p, q= aux.begin();
    while (p2!=H.end() && q!=aux.end() && *p2==*q) {
      p2++; q++;
    }
    if (q==aux.end() && p2!=H.end()) return *p2;
    if (p==H.begin()) return 0;
    p--;
  }
  return 0;
}

// VERSION 3
// Iterando al reves (desde end hacia begin)
// pero con reverse_iterator. OJO que los reverse_iterator
// p++ avanza al reves (hacia begin()). 
int ppt3(list<int> &H, int n) {
  if (int(H.size())<n) return 0;

  list<int>::reverse_iterator p = H.rbegin();
  list<int> aux;
  for (int j=0; j<n; j++)
    aux.insert(aux.begin(),*p++);

  p = H.rbegin();  
  while (p!=H.rend()) {
    // Para convertir de reverse_iterator a iterator
    // hay que usar el metodo `base()'
    list<int>::iterator p2=p.base(), q=aux.begin();
    // Al convertir el reverse_iterator a iterator
    // se corre en uno hacia end(), por eso hay que
    // hacer este --
    p2--;
    while (p2!=H.end() && q!=aux.end() && *p2==*q) {
      p2++; q++;
    }
    if (q==aux.end() && p2!=H.end()) return *p2;
    p++; 
  }
  return 0;
}

//---:---<*>---:---<*>---:---<*>---:---<*>---:---<*>
int main() {
  Eval ev;
  int vrbs = 0;
  int seed = 123;
  int h1=0,h2=0,h3=0;

  ev.eval1(mochila,vrbs);
  h1 = ev.evalr1(mochila,seed,vrbs);

  ev.eval2(enunosolo,vrbs);
  h2 = ev.evalr2(enunosolo,seed,vrbs);


#define PPT ppt3
  ev.eval3(PPT,vrbs);
  h3 = ev.evalr3(PPT,seed,vrbs);

  // para S=123 -> H1=333 H2=357 H3=340
  printf("S=%03d -> H1=%03d H2=%03d H3=%03d\n",
         seed,h1,h2,h3);

  ev.eval3(ppt3,vrbs);
  h3 = ev.evalr3(ppt3,seed,vrbs);
  printf("S=%03d -> H1=%03d H2=%03d H3=%03d\n",
         seed,h1,h2,h3);

  return 0;
}

Generated by GNU Enscript 1.6.6.