from bisect import bisect_right def chon_buoi(buoi): thu_tu = sorted(buoi, key=lambda x: (x[2], x[0])) cuoi = [b[2] for b in thu_tu] diem, tuong_thich = [0], [] for i, (_, dau, _, gia_tri) in enumerate(thu_tu): p = bisect_right(cuoi, dau, 0, i) tuong_thich.append(p) diem.append(max(diem[-1], gia_tri + diem[p])) chon = [] i = len(thu_tu) while i: if diem[i] > diem[i-1]: chon.append(thu_tu[i-1][0]) i = tuong_thich[i-1] else: i -= 1 return diem[-1], chon[::-1] du_lieu = [("A", 0, 2, 3), ("B", 2, 4, 3), ("C", 0, 4, 8), ("D", 4, 6, 2)] assert chon_buoi(du_lieu) == (10, ["C", "D"]) assert chon_buoi([]) == (0, []) print(chon_buoi(du_lieu))