2772 - Placinte: Difference between revisions
Andrada378 (talk | contribs) No edit summary |
Andrada378 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
== Placinte == | |||
Nimic nu se compară cu plăcintele calde ieșite din cuporul bunicii! Alexa simte mirosul ispititor al bunătățurilor proaspete și coboară în bucătărie ca să descopere n tipuri diferite de plăcinte. Unele sunt cu mere, altele cu vișine, altele cu brânză, în fine! Bunica ei a făcut câte o infinitate din fiecare tip. Dacă fata alege să mănânce un tip de plăcintă, ea îl mănâncă numai sub forma unui set. Un set de plăcinte de tipul i este egal cu 2i−1 | |||
. Fata cunoaște din experiență timpul Ti necesar pentru a mânca un set de plăcinte de tip i. | |||
== Cerința == | |||
Știind că fata va mânca fără preferințe câte seturi de plăcinte va vrea din fiecare tip, să se calculeze timpul minim necesar pentru a mânca cel puțin k plăcinte. | Știind că fata va mânca fără preferințe câte seturi de plăcinte va vrea din fiecare tip, să se calculeze timpul minim necesar pentru a mânca cel puțin k plăcinte. | ||
Date de | == Date de intrare == | ||
Programul citește de la tastatură numerele n, k și apoi n numere, reprezentând timpurile T1,T2,…,Tn | |||
necesare pentru a mânca un set din fiecare tip de plăcintă (în ordine, tipurile 1, 2, …, n). | |||
== Date de ieșire == | |||
Programul va afișa pe ecran un singur număr, timplul minim necesar pentru a mânca cel puțin k plăcinte. | Programul va afișa pe ecran un singur număr, timplul minim necesar pentru a mânca cel puțin k plăcinte. | ||
Rezolvare: | == Restricții și precizări == | ||
* 1≤n≤30 | |||
* 1≤k,Ti≤109 | |||
== Exemple == | |||
'''Intrare''' | |||
4 11 | |||
2 3 4 5 | |||
'''Ieșire''' | |||
9 | |||
În acest exemplu, este mai avantajos să mănânce un set de plăcinte de tip 4 (adică 8 plăcinte) și un set de tip 3 (4 plăcinte), consumând în total 12 plăcinte în 9 unități de timp. Ar putea să mănânce 11 plăcinte sub forma 1 + 2 + 8, dar ar dura 10 unități de timp. | |||
…sau: | |||
'''Intrare''' | |||
2 5 | |||
1 3 | |||
'''Ieșire''' | |||
5 | |||
…sau: | |||
'''Intrare''' | |||
5 1000000000 | |||
32145 1421431 13124 315125 124124 | |||
'''Ieșire''' | |||
3281000000000 | |||
== Rezolvare: == | |||
<syntaxhighlight lang="python"> | |||
def validare_date(n, k, Ti): | |||
# Verifică condițiile de validare | |||
if not (1 <= n <= 30): | |||
return False, "Numărul de tipuri de plăcinte trebuie să fie între 1 și 30." | |||
if not (1 <= k <= 10 ** 9): | |||
return False, "Numărul minim de plăcinte de consumat trebuie să fie între 1 și 10^9." | |||
if not all(1 <= timp <= 10 ** 9 for timp in Ti): | |||
return False, "Toate timpurile trebuie să fie între 1 și 10^9." | |||
return True, None | |||
def timp_minim_placinte(Ti, n, k): | |||
dp = [float('inf')] * (k + 1) | |||
dp[0] = 0 | |||
for i in range(1, k + 1): | |||
for j in range(n): | |||
if i >= 2 ** j: | |||
dp[i] = min(dp[i], dp[i - 2 ** j] + (2 ** j) * Ti[j]) | |||
return dp[k] | |||
# Citirea datelor de la tastatură | |||
n = int(input("Introdu numărul de tipuri de plăcinte: ")) | |||
k = int(input("Introdu numărul minim de plăcinte de consumat: ")) | |||
Ti = list(map(int, input("Introdu timpurile necesare pentru fiecare tip de plăcinte: ").split())) | |||
# Validare date | |||
valid, mesaj_eroare = validare_date(n, k, Ti) | |||
if valid: | |||
timp_minim = timp_minim_placinte(Ti, n, k) | |||
print(timp_minim) | |||
else: | |||
print("Datele introduse nu sunt valide. Motiv:", mesaj_eroare) | |||
</syntaxhighlight> |
Latest revision as of 12:55, 5 January 2024
Placinte[edit | edit source]
Nimic nu se compară cu plăcintele calde ieșite din cuporul bunicii! Alexa simte mirosul ispititor al bunătățurilor proaspete și coboară în bucătărie ca să descopere n tipuri diferite de plăcinte. Unele sunt cu mere, altele cu vișine, altele cu brânză, în fine! Bunica ei a făcut câte o infinitate din fiecare tip. Dacă fata alege să mănânce un tip de plăcintă, ea îl mănâncă numai sub forma unui set. Un set de plăcinte de tipul i este egal cu 2i−1
. Fata cunoaște din experiență timpul Ti necesar pentru a mânca un set de plăcinte de tip i.
Cerința[edit | edit source]
Știind că fata va mânca fără preferințe câte seturi de plăcinte va vrea din fiecare tip, să se calculeze timpul minim necesar pentru a mânca cel puțin k plăcinte.
Date de intrare[edit | edit source]
Programul citește de la tastatură numerele n, k și apoi n numere, reprezentând timpurile T1,T2,…,Tn
necesare pentru a mânca un set din fiecare tip de plăcintă (în ordine, tipurile 1, 2, …, n).
Date de ieșire[edit | edit source]
Programul va afișa pe ecran un singur număr, timplul minim necesar pentru a mânca cel puțin k plăcinte.
Restricții și precizări[edit | edit source]
- 1≤n≤30
- 1≤k,Ti≤109
Exemple[edit | edit source]
Intrare
4 11
2 3 4 5
Ieșire
9
În acest exemplu, este mai avantajos să mănânce un set de plăcinte de tip 4 (adică 8 plăcinte) și un set de tip 3 (4 plăcinte), consumând în total 12 plăcinte în 9 unități de timp. Ar putea să mănânce 11 plăcinte sub forma 1 + 2 + 8, dar ar dura 10 unități de timp.
…sau:
Intrare
2 5
1 3
Ieșire
5
…sau:
Intrare
5 1000000000
32145 1421431 13124 315125 124124
Ieșire
3281000000000
Rezolvare:[edit | edit source]
<syntaxhighlight lang="python"> def validare_date(n, k, Ti):
# Verifică condițiile de validare if not (1 <= n <= 30): return False, "Numărul de tipuri de plăcinte trebuie să fie între 1 și 30."
if not (1 <= k <= 10 ** 9): return False, "Numărul minim de plăcinte de consumat trebuie să fie între 1 și 10^9."
if not all(1 <= timp <= 10 ** 9 for timp in Ti): return False, "Toate timpurile trebuie să fie între 1 și 10^9."
return True, None
def timp_minim_placinte(Ti, n, k):
dp = [float('inf')] * (k + 1) dp[0] = 0
for i in range(1, k + 1): for j in range(n): if i >= 2 ** j: dp[i] = min(dp[i], dp[i - 2 ** j] + (2 ** j) * Ti[j])
return dp[k]
- Citirea datelor de la tastatură
n = int(input("Introdu numărul de tipuri de plăcinte: ")) k = int(input("Introdu numărul minim de plăcinte de consumat: ")) Ti = list(map(int, input("Introdu timpurile necesare pentru fiecare tip de plăcinte: ").split()))
- Validare date
valid, mesaj_eroare = validare_date(n, k, Ti)
if valid:
timp_minim = timp_minim_placinte(Ti, n, k) print(timp_minim)
else:
print("Datele introduse nu sunt valide. Motiv:", mesaj_eroare)
</syntaxhighlight>