Documente Academic
Documente Profesional
Documente Cultură
Aplicații Greedy
Cuprins:
Problema #1340 Rucsac.......................................................................................................................................................... 1
Problema #1373 Reactivi(OJI 2004, clasa IX-a) ....................................................................................................................... 3
Problema #950 Cerc3(Olimpiada de Informatică, etapa pe sector, Bucureşti, 2011) ............................................................ 4
Temă : ..................................................................................................................................................................................... 6
inițial
Obiect 1 2 3 4
Greutate 10 5 12 20
Valoare 60 50 60 140
Eficiență(valoare/greutate) 6 10 5 7
Se ordonează descrescător după eficiența la transport
După ordonare
Obiect 2 4 1 3
Greutate 5 20 10 12
Valoare 50 140 60 60
Eficiență(valoare/greutate) 10 7 6 5
Soluția este:
Vom reprezenta soluția problemei ca pe un vector de structuri. Vom ordona obiectele descrescător ținând cont de
raportul valoarea/greutate. Atâta timp cât obiectele încap în rucsac, le vom adaugă în întregime și putem întâlni una din
următoarele situații:
obiectele alese au o greutate totală egală cu a rucsacului;
mai există loc în rucsac, dar nu mai încape nici un obiect întreg, caz în care adăugăm o fracțiune de obiect.
După ordonare
Greutate rămasă rucsac 30 30-5=25 25-20=5 0
Obiect 2 4 1 3
Greutate 5 20 10 12
Valoare 50 140 60 60
Eficiență(valoare/greutate) 10 7 6 5
Fracțiune selectată 1 1 0.5 (5/10) -
(greutate rămasă/greutatea obiectului
Câștig 0+50=50 50+140=190 190+30=220
Sursa c++:
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("obiecte.in");
struct obiect
{
int id;
float greutate, valoare, eficienta;
};
cout<<c;
}
int main()
{
obiect a[1001];
int n;
float Gmax;
citire(a, n, Gmax);
greedy(a, n, Gmax);
return 0; }
Problema #1373 Reactivi(OJI 2004, clasa IX-a)
Într-un laborator de analize chimice se utilizează N reactivi. Se știe că, pentru a evita accidentele sau deprecierea
reactivilor, aceștia trebuie să fie stocați în condiții de mediu speciale. Mai exact, pentru fiecare reactiv x, se precizează
intervalul de temperatură [minx, maxx] în care trebuie să se încadreze temperatura de stocare a acestuia.
Reactivii vor fi plasați în frigidere. Orice frigider are un dispozitiv cu ajutorul căruia putem stabili temperatura (constantă)
care va fi in interiorul acelui frigider (exprimată într-un număr întreg de grade Celsius).
Scrieți un program care să determine numărul minim de frigidere necesare pentru stocarea reactivilor chimici.
Date de intrare
Fișierul de intrare reactivi.in conține:
pe prima linie numărul natural N, care reprezintă numărul de reactivi;
pe fiecare dintre următoarele N linii se află min max (două numere întregi separate printr-un spațiu); numerele
de pe linia x+1 reprezintă temperatura minimă, respectiv temperatura maximă de stocare a reactivului x.
Date de ieșire
Fișierul de ieșire reactivi.out va conține o singură linie pe care este scris numărul minim de frigidere necesar.
Restricții și precizări
1 <= N <= 8000
-100 <= minx <= maxx <= 100 (numere întregi, reprezentând grade Celsius), pentru orice x de la 1 la N un frigider
poate conține un număr nelimitat de reactivi
Exemplu:
reactivi.in reactivi.out
5 2
-10 10
10 12
-20 10
7 10
7 8
Rezolvare:
inițial
Reactiv 1 2 3 4 5
Temperatura minimă -10 10 -20 7 7
Temperatura maximă 10 12 10 10 8
inițial
Reactiv 1 2 3 4 5
Temperatura minimă 7 -10 -20 7 10
Temperatura maximă 8 10 10 10 12
Ptmax 1 1 1 1 5
Nr 1 1 1 1 2
Memorăm în PTmax indicele primului reactiv(ea este cea mai mare temperatură) și inițializăm numărul de frigidere
necesare cu 1. Parcurgem restul reactivilor și dacă temperatura minimă a reactivului curent este mai mare decât
temperatura maximă păstrată, atunci vom avea nevoie de un alt frigider:
#include <bits/stdc++.h>
using namespace std;
ifstream fin("reactivi.in");
ofstream fout("reactivi.out");
struct react {
int x,y;
}v[8005];
}
int main()
{
int n;
citeste(v,n);
greedy(v,n);
return 0;
}
Date de intrare
Fișierul de intrare cerc3.in conține pe prima linie pe prima linie, o valoare naturală n, reprezentând numărul de cercuri, iar
pe următoarele n linii câte două numere naturale, separate printr-un spaţiu, care reprezintă abscisa x1 a centrului primului
cerc şi raza sa r1,…, abscisa xn a centrului celui de-al n-lea cerc şi raza sa rn.
Date de ieșire
Fișierul de ieșire cerc3.out va conține o linie pe care va fi scris numărul natural y reprezentând numărul maxim de cercuri
exterioare ale căror centre sunt situate pe axa Ox.
Exemplu:
cerc3.in cerc3.out
8 4
3 1
1 4
8 1
11 2
15 2
16 6
21 2
21 1
Numărul maxim de cercuri exterioare două câte două este y=4. De exemplu, pot fi alese cele 4 cercuri colorate din imaginea
de mai jos:
Fiecărui cerc cu centrul în xk şi raza rk îi corespunde intervalul [xk - rk , xk + rk ]. Problema constă acum în a
determina un număr maxim de intervale disjuncte, adică problema spectacolelor.
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
ifstream f("cerc3.in");
ofstream g("cerc3.out");
Temă :
#2684, #400, #403(daca stiti siruri de caractere) #556, #1207, #2044
https://practice.geeksforgeeks.org/problems/shop-in-candy-store/0#ExpectOP
https://practice.geeksforgeeks.org/problems/smallest-number/0