Mi solucion Ejercicio 2 nacional 2012 nivel 2
Mi solucion del ejercicio 2 del nacional 2012 nivel 2 que dice:
Tres tristes tigres tragan trigo en un trigal. Tristes estan porque solo trigo tragan. La primera tabla da el nombre de cada tigre, la cantidad maxima y minima de kilocalorias que pueden comer, y la cantidad minima o maxima (en porcentaje de pso ingerido) que debe comer de cada macronutriente (proteínas, lípidos, hidratos de carbono).
Tigre | min kcal | max kcal | min % prot | max % lip | max % hidr. carb. |
Tristán | 6696 | 8184 | 18,5 % | 4,0 % | 70,0 % |
Tirso | 5670 | 6930 | 15,5 % | 3,5 % | 75,0 % |
Tatiana | 4653 | 5687 | 13,5 % | 3,0 % | 80,0 % |
Hay tres variedades de trigo. La segunda tabla da la composición natural de cadavariedad, por cada pastilla de trigo de 100 g que no se puede fraccionar, y cuantas pastillas disponibles hay.
Trigo | kcal | proteínas | lípidos | hidr. carb. | past. disponibles |
germen | 360 | 23.15 | 9,72 | 51,80 | 18 |
salvado | 216 | 15,55 | 4,25 | 64,51 | 22 |
harinero | 331 | 10,35 | 1,56 | 74,24 | 30 |
A) dar un menú posible, cuántas pastillas de cada variedad darle a cada tigre.
B) dar todos los menús posibles
#include <iostream> #include <vector> #include <cstdlib> using namespace std; // solucion de Ariel Nowik // funcion de numeros al azar int random(int start = 0,int stop = 1){ stop = stop - 1; unsigned int iseed = (unsigned int)time(NULL); srand (iseed); int ran = rand(); return float(ran) / float(RAND_MAX) * (stop-start) + start; } // clase tigre para crear los tres tigres y darles propiedades class tigre{ private: double max_cal; double min_cal; double min_prot; double min_lip; double max_hidr; public: int inicializar(double mi_cal,double m_cal,double m_prot,double m_lip,double m_hidr){ // funcion inicializar en la que //se le dan las caracteristicas a los tigres max_cal = m_cal; min_cal = mi_cal; min_prot = m_prot; min_lip = m_lip; max_hidr = m_hidr; } int dar_alimento(int germen, int salvado, int harinero){ //funcion dar alimento que checkea si el tigre puede comer //los tres alimentos de paramentros double kcal = double(germen) * 360.0 + double(salvado) * 216.0 + double(harinero) * 331.0; double prot = double(germen) * 23.15 + double(salvado) * 15.55 + double(harinero) * 10.35; double lipi = double(germen) * 9.72 + double(salvado) * 4.25 + double(harinero) * 1.56; double hidr = double(germen) * 51.8 + double(salvado) * 64.51 + double(harinero) * 74.24; double peso = double(germen) * 100.0 + double(salvado) * 100.0 + double(harinero) * 100.0; double porcentaje_prot = prot / peso * 100.0; double porcentaje_lipi = lipi / peso * 100.0; double porcentaje_hidr = hidr / peso * 100.0; if (kcal >= min_cal and kcal <= max_cal){ if (porcentaje_prot >= min_prot){ if (porcentaje_lipi >= min_lip){ if (porcentaje_hidr <= max_hidr){ return true; } } } } return false; } }; /*funcion main*/ int main(){ //vector (lista con soluciones) con vectores //(para poner a cada tigre en todas las soluciones encontradas) //que tienen vectores adentro (uno para cada tipo de trigo) //con enteros (los alimentos) //en caso de que los tigres pedan comerlo vector < vector < vector <int> > > soluciones; //vector que alamcena los objetos tigre con las propiedades vector <tigre> tigres; tigre tigre1; //cargamos propiedades en el tigre 1 tigre1.inicializar(6696.0,8184.0,18.5,4.0,70.0); //aniadimos al tigre a la lista de tigres tigres.push_back(tigre1); tigre tigre2; //cargamos propiedades en el tigre 2 tigre2.inicializar(5670.0,6930.0,16.5,3.5,75.0); //aniadimos al tigre a la lista de tigres tigres.push_back(tigre2); tigre tigre3; //cargamos propiedades en el tigre 3 tigre3.inicializar(4653.0,5687.0,13.5,3.0,80.0); //aniadimos al tigre a la lista de tigres tigres.push_back(tigre3); //for para germen, salvado y harinero para el primer tigre for (int germen = 0;germen < 19;germen ++){ for (int salvado = 0;salvado < 23;salvado ++){ for (int harinero = 0;harinero < 31;harinero ++){ //si se puede alimentar al tigre 0 se para al siguiente for if (tigres[0].dar_alimento(germen,salvado,harinero) == true){ //for para germen, salvado y harinero para el segunto tigre for (int germen2 = 0;germen2 < 19 -germen;germen2++){ for (int salvado2 = 0;salvado2 < 23 - salvado;salvado2++){ for (int harinero2 = 0;harinero2 < 31 - harinero;harinero2++){ //si se puede alimentar al tigre 1 se para al siguiente for if (tigres[1].dar_alimento(germen2,salvado2,harinero2) == true){ for (int germen3 = 0;germen3 < 19 - germen - germen2;germen3 ++){ for (int salvado3 = 0;salvado3 < 23 - salvado - salvado2;salvado3++){ for (int harinero3 = 0;harinero3 < 31 - harinero - harinero2;harinero3++){ //si se puede alimentar al tigre 2 se almacena la solucion en el vector (lista) soluciones if (tigres[2].dar_alimento(germen3,salvado3,harinero3) == true){ //vector para almacenar alimentacion del primer tigre vector <int> nums; nums.push_back(harinero); nums.push_back(salvado); nums.push_back(germen); //vector para almacenar alimentacion del segundo tigre vector <int> nums2; nums2.push_back(harinero2); nums2.push_back(salvado2); nums2.push_back(germen2); //vector para almacenar alimentacion del tercer tigre vector <int> nums3; nums3.push_back(harinero3); nums3.push_back(salvado3); nums3.push_back(germen3); //vector con los tres conjuntos de alimentos para cada tigre vector < vector <int> > sol; sol.push_back(nums); sol.push_back(nums2); sol.push_back(nums3); //ese vector se agrega al vector (lista) de soluciones soluciones.push_back(sol); } } } } } } } } } } } } //imprimimos cantidad de soluciones cout<<"Hay unas "<<soluciones.size()<<" soluciones"<<endl; //imprimimos una solucion al azar int num = random(0,soluciones.size()); cout<<"------------------------------------"<<endl; cout<<"SOLUCION AL AZAR (ID = "<<num<<") : "<<endl; for (int x = 0;x < soluciones[num].size();x++){ cout<<"Tigre "<<x+1; if (x == 0){ cout<<" (Tristan):"<<endl; } if (x == 1){ cout<<" (Tirso):"<<endl; } if (x == 2){ cout<<" (Tatiana):"<<endl; } cout<<"germen : "<<soluciones[num][x][0]<<endl; cout<<"salvado : "<<soluciones[num][x][1]<<endl; cout<<"harinero: "<<soluciones[num][x][2]<<endl; } cout<<"escriba algo y presione enter para continuar . . ."<<endl; int h; cin>>h; }
Salida del programa:
Hay unas 1 soluciones
------------------------------------
SOLUCION AL AZAR (ID = 0) :
Tigre 1 (Tristan):
germen : 6
salvado : 2
harinero: 12
Tigre 2 (Tirso):
germen : 5
salvado : 9
harinero: 6
Tigre 3 (Tatiana):
germen : 7
salvado : 11
harinero: 0
Una sola solucion posible al parecer. Alguna otra forma de resolverlo?