4046 - Parfum
Cerinţa
Dorești să faci un parfum pentru care vei avea nevoie de X petale de flori. În grădina ta sunt N tipuri de flori, fiecare cu un anumit număr de petale, notat cu count[i]. Odată la T zile, toate florile își vor scutura petalele, urmând ca tu să le colectezi. De asemenea, florile tale au fiecare câte o durată de viață exprimată în zile, notată cu days[i]. Odată ce o floare moare, ea nu mai produce petale. Acum, te ești interesat să găsești valoarea maximă a lui T pentru care s-ar strânge minim X petale de flori după primele Z zile.
Date de intrare
Programul citește de la tastatură numerele N, X și Z. Pe umrătoarele N linii se află câte o pereche de valori de forma count[i], days[i].
Date de ieșire
Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect.", programul va afișa pe valoarea maximă a lui T pentru care se poate produce parfumul după Z zile. În cazul în care datele nu respectă restricțiile, se va afișa pe ecran: "Datele nu corespund restricțiilor impuse.".
Restricţii şi precizări
- 1 ≤ N ≤ 100 000
- 1 ≤ count[i] ≤ 1 000 000 000
- 1 ≤ days[i] ≤ 1 000 000 000
- 1 ≤ X ≤ 1 000 000 000
- 1 ≤ Z ≤ 1 000 000 000
- Se garantează că T maxim este cel mult 1 000 000 000.
Exemple
Exemplul 1
- Intrare
- 4 20 7
- 4 5
- 10 2
- 6 4
- 2 10
- Ieșire
- Datele sunt introduse corect.
- 2
Exemplul 2
- Intrare
- 2 100 10
- 10 1
- 1 10
- Ieșire
- Datele sunt introduse corect.
- 10
Exemplul 3
- Intrare
- 5 10 1000000001
- 3 5
- 2 1
- 1 1
- 7 6
- 5 3
- Ieșire
- Datele nu corespund restricțiilor impuse.
Rezolvare
<syntaxhighlight lang="python" line="1">
- 4046 - Parfum
def validare(n, x, z, flowers):
if not (1 <= n <= 100000 and 1 <= x <= 1000000000 and 1 <= z <= 1000000000): return False for i in range(n): if not (1 <= flowers[i][0] <= 1000000000 and 1 <= flowers[i][1] <= 1000000000): return False return True
def parfum(n, x, z, flowers):
tmax = 0 l = 1 r = 1000000000 while l <= r: mid = (l + r) // 2 total_petals = 0 for i in range(n): total_petals += (mid // flowers[i][1]) * flowers[i][0] if total_petals >= x * z and mid >= tmax: tmax = mid l = mid + 1 else: r = mid - 1 if tmax == 0: return -1 return tmax
def main():
try: n = int(input()) x, z = map(int, input().split()) flowers = [list(map(int, input().split())) for _ in range(n)] except: print("Datele nu corespund formatului cerut.") return
if not validare(n, x, z, flowers): print("Datele nu corespund restricțiilor impuse.") return
tmax = parfum(n, x, z, flowers)
if tmax == -1: print("Nu există nicio combinație de flori care să producă atât de mult parfum.") else: print("Datele sunt introduse corect.") print(tmax)
if __name__ == "__main__":
main()
</syntaxhighlight>