3975 - Intervale AB
Cerinţa[edit | edit source]
Dându-se N intervale [a, b], calculați numărul maxim de astfel de intervale care se intersectează în cel puțin un punct.
Date de intrare[edit | edit source]
Fișierul de intrare intervalein.txt conține pe prima linie numărul N, iar pe următoarele N linii 2 numere naturale separate prin spații, reprezentând limitele intervalelor [a, b].
Date de ieșire[edit | edit source]
Fișierul de ieșire intervaleout.txt va conține pe prima linie numărul mx, reprezentând numărul maxim de intervale care se intersectează în cel puțin un punct.
Restricţii şi precizări[edit | edit source]
- 1 ⩽ N ⩽ 100.000
- -2.000.000.000 ⩽ a ⩽ b ⩽ 2.000.000.000
Exemplu[edit | edit source]
- intervalein.txt
5 1 5 3 4 -10 10 -23 -20 100 200
- intervaleout.txt
Datele de intrare corespund restrictiilor impuse. 3
Exemplu 2[edit | edit source]
- intervalein.txt
-1 1 5 3 4 -10 10 -23 -20 100 200
- intervaleout.txt
Datele de intrare nu corespund restrictiilor impuse.
Rezolvare[edit | edit source]
<syntaxhighlight lang="python" line> def max_intersecting(intervals):
# Sortăm intervalele după capătul drept intervals.sort(key=lambda x: x[1])
# Inițializăm o listă pentru a stoca intervalele în curs de procesare current_intervals = []
# Inițializăm numărul maxim de intervale care se intersectează max_inter = 0
for interval in intervals: # Adăugăm intervalul curent la lista de intervale în curs de procesare current_intervals.append(interval)
# Eliminăm intervalele care s-au terminat while current_intervals and current_intervals[0][1] < interval[0]: current_intervals.pop(0)
# Actualizăm numărul maxim de intervale care se intersectează max_inter = max(max_inter, len(current_intervals))
return max_inter
def main():
# Deschidem fișierul de intrare și citim datele with open('intervalein.txt', 'r') as f: n = int(f.readline().strip()) intervals = [list(map(int, f.readline().strip().split())) for _ in range(n)]
# Verificăm dacă numărul de intervale respectă restricțiile if 1 <= n <= 100000 and all(-2000000000 <= a <= b <= 2000000000 for a, b in intervals): # Dacă da, calculăm numărul maxim de intervale care se intersectează result = max_intersecting(intervals) status = "Datele de intrare corespund restrictiilor impuse." else: # Dacă nu, afișăm un mesaj de eroare result = "" status = "Datele de intrare nu corespund restrictiilor impuse."
# Scriem rezultatul în fișierul de ieșire with open('intervaleout.txt', 'w') as f: f.write(status + '\n' + str(result))
if __name__ == "__main__":
main()
</syntaxhighlight>