2772 - Placinte: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
No edit summary
Andrada378 (talk | contribs)
No edit summary
 
Line 1: Line 1:
Cerinta:
== 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 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 iesire:
== 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 ==
  def timp_minim_placinte(Ti, n, k):
 
    dp = [float('inf')] * (k + 1)
* 1≤n≤30
    dp[0] = 0
* 1≤k,Ti≤109
 
    for i in range(1, k + 1):
== Exemple ==
        for j in range(n):
'''Intrare'''
            if i >= 2 ** j:
 
                dp[i] = min(dp[i], dp[i - 2 ** j] + (2 ** j) * Ti[j])
4 11
 
    return dp[k]
2 3 4 5
 
# Citirea datelor de la tastatură
'''Ieșire'''
n = int(input("Introdu numărul de tipuri de plăcinte: "))
 
k = int(input("Introdu numărul minim de plăcinte de consumat: "))
9
Ti = list(map(int, input("Introdu timpurile necesare pentru fiecare tip de plăcinte: ").split()))
 
Î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.
timp_minim = timp_minim_placinte(Ti, n, k)
 
print(timp_minim)
…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]


  1. 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()))

  1. 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>