Greedy Algorithm to cover segments with minimum number of points. useful for organising groups of children for instance.
# Uses python3
import sys
from collections import namedtuple
Segment = namedtuple('Segment', 'start end')
def optimal_points(segments):
points = []
sorted_segments = sorted(segments, key=lambda x: x[1])
max_point = -1
for s in sorted_segments:
if s.start>max_point:
max_point = s.end
points.append(s.end)
return points
input = sys.stdin.read()
n, *data = map(int, input.split())
segments = list(map(lambda x: Segment(x[0], x[1]), zip(data[::2], data[1::2])))
points = optimal_points(segments)
print(len(points))
for p in points:
print(p, end=' ')