Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
2056 - Popcorn
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
==Cerința== Cu toții știm că popcornul este o adevărată delicatesă culinară. În pregătirile tale pentru lotul de anul acesta (și pentru petrecerile de după), ai făcut comandă de <code>N</code> tipuri de floricele de porumb pentru microunde. Fiecare tip are asociate <code>3</code> valori: * <code>A[i]</code> = Timpul (în secunde) la care orice floricică de acel tip “pocnește”; * <code>B[i]</code> = Timpul (în secunde) la care orice floricică de acel tip “se arde”; * <code>C[i]</code> = Cantitatea (în floricele) a respectivului tip. Mai ai la dispoziție <code>M</code> pungi pentru floricele de unică folosință de capacitate foarte mare (practic, infinită) și un cuptor cu microunde. Cum, bineînțeles, nimănui nu îi plac floricelele nefăcute sau cele arse, îți dorești să le partiționezi convenabil în cele <code>M</code> pungi și apoi să le introduci pe rând în cuptorul cu microunde, setându-i un timp de preparare <code>prep[i]</code> corespunzător, astfel încât după cele <code>M</code> tranșe să obții cât mai multe floricele comestibile. Formal, o floricică de tipul <code>i</code> introdusă în punga <code>j</code> , setată la timpul (în secunde) de preparare <code>prep[j]</code> este comestibilă dacă și numai dacă <code>A[i] ≤ prep[j] < B[i]</code>. Fiind date cele <code>N</code> tipuri de floricele și numărul de pungi disponibile, trebuie să găsești o partiție convenabilă și timpii optimi de preparare pentru fiecare pungă, astfel încât la final să obții numărul maxim de floricele comestibile, pe care să îl afișezi în fișierul de ieșire. Prea ușor! ==Date de intrare== Fișierul de intrare <code>popcorn.in</code> conține pe prima linie numerele naturale <code>N</code> și <code>M</code> , separate printr-un spațiu, cu semnificația din enunț. Pe următoarele <code>N</code> linii se vor afla valorile <code>A[i]</code> , <code>B[i]</code> , <code>C[i]</code> corespunzătoare fiecărui tip de floricele. ==Date de ieșire== Pe ecran se va afișa mesajul: "Datele de intrare corespund restricțiilor impuse." Pe următorul rând se va afișa un singur număr natural reprezentând numărul maxim de floricele comestibile care se poate obține. În cazul în care datele introduse de la tastatură nu îndeplinesc cerințele enunțate, pe ecran se va afișa mesajul "Datele de intrare nu corespund restricțiilor impuse." ==Restricții și precizări== * <code>1 ≤ M ≤ N ≤ 200 000</code> * <code>1 ≤ A[i] < B[i] ≤ 200 000</code> * Numărul total de floricele nu depășește <code>109</code> * '''Unele pungi pot fi goale !''' * <code>X = max{N, B[1], B[2], …, B[N]}</code> ==Exemplu 1== ;Intrare :5 2 :2 4 3 :1 5 6 :4 8 10 :7 8 2 :10 11 2 ;Ieșire :Datele de intrare corespund restricțiilor impuse. :21 ===Explicație=== Avem <code>5</code> tipuri de floricele și <code>2</code> pungi disponibile. Una din soluțiile posibile este: * Punga <code>1</code> va conține tipurile <code>1</code> și <code>2</code> și va fi preparată la timpul <code>3</code>. * Punga <code>2</code> va conține tipurile <code>3, 4, 5</code> și va fi preparată la timpul <code>7</code>. Toate tipurile de floricele vor fi preparate cu succes, în afară de tipul <code>5</code>, care vor rămâne în stadiul de boabe. ==Exemplu 2== ;Intrare :3 3 :1 2 2 :2 3 3 :1 3 5 ;Ieșire :Datele de intrare corespund restricțiilor impuse. :10 ===Explicație=== Putem alege pungile astfel: * Punga <code>1</code> va conține tipurile <code>1, 3</code> și va fi preparată la timpul <code>1</code>. * Punga <code>2</code> va conține tipul <code>2</code> și va fi preparată la timpul <code>2</code>. * Punga <code>3</code> va fi goală. ==Exemplu 3== ;Intrare :3 3 :2 1 2 :3 2 3 :1 3 5 ;Ieșire :Datele de intrare nu corespund restricțiilor impuse. ==Rezolvare== <syntaxhighlight lang="python" line="1"> #2056 Popcorn T_POCNIRE = 0 T_ARDERE = 1 CANTITATE = 2 def conditii(n_tipuri, n_pungi, tipuri_floricele): for tip in tipuri_floricele: if not 1 <= tip[T_POCNIRE] < tip[T_ARDERE] <= 200_000: return False if sum([tip[CANTITATE] for tip in tipuri_floricele]) > 10**9: return False if not 1 <= n_pungi <= n_tipuri <= 200_000: return False x = [tip[T_ARDERE] for tip in tipuri_floricele] x.append(n_tipuri) x_max = max(x) if not n_pungi <= x_max <= 50_000: return False return True def popcorn(n_tipuri, n_pungi, floricele): # Inițializăm o listă bidimensională pentru a stoca cantitatea de popcorn care poate fi preparată pentru fiecare # tip de popcorn și pentru fiecare pas de timp # Lista are n_tipuri rânduri și 50,000 coloane, deoarece fiecare tip de popcorn poate fi preparat pentru maxim # 50,000 de pași de timp nr = [[0 for j in range(50_000)] for i in range(n_tipuri)] for i in range(n_tipuri): # Pentru fiecare tip de popcorn, parcurgem pașii de timp când popcorn-ul poate fi preparat # (de la T_POCNIRE la T_ARDERE) for k in range(floricele[i][T_POCNIRE], floricele[i][T_ARDERE]): if k < floricele[i][T_ARDERE]: nr[i][k] = floricele[i][CANTITATE] # Inițializăm o altă listă bidimensională cu n_tipuri+1 rânduri și n_pungi+1 coloane # Fiecare element din listă va stoca cantitatea maximă de popcorn care poate fi pusă în j pungi # folosind primele i tipuri de popcorn dinamic = [[0 for j in range(n_pungi+1)] for i in range(n_tipuri+1)] for i in range(1, n_tipuri+1): for j in range(1, n_pungi+1): for k in range(j, -1, -1): # Calculăm cantitatea maximă de popcorn care poate fi pusă în j pungi folosind primele i tipuri de popcorn, # bazat pe cantitatea de popcorn care poate fi preparată pentru fiecare tip și pas de timp, stocată în lista "nr" dinamic[i][j] = max(dinamic[i][j], dinamic[i-1][k] + sum(nr[i-1][:j-k])) # Printăm cantitatea maximă de popcorn care poate fi pusă în pungi, # care este valoarea din colțul din dreapta jos al tabelei "dinamic" print(max(dinamic[-1])) if __name__ == "__main__": n_tipuri, n_pungi = [int(x) for x in input().split(" ")] floricele = [] for i in range(n_tipuri): timp_pana_la_pocnire, timp_pana_la_ardere, cantitate = [int(x) for x in input().split()] floricele.append([timp_pana_la_pocnire, timp_pana_la_ardere, cantitate]) if not conditii(n_tipuri, n_pungi, floricele): print("Datele de intrare nu corespund restricțiilor impuse.") else: print("Datele de intrare corespund restricțiilor impuse.") popcorn(n_tipuri, n_pungi, floricele) </syntaxhighlight>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width