Solution #7630bd9e-6eb0-4ccd-9f0c-46907ede8766

completed

Score

80% (4/5)

Runtime

36μs

Delta

No change vs parent

-20.0% vs best

Same as parent

Solution Lineage

Current80%Same as parent
ae983b2480%Same as parent
8252644380%Same as parent
9db0fb8580%Improved from parent
df1d6fd340%Regression from parent
ae833bc280%Same as parent
c90b917a80%First in chain

Code

def solve(input):
    jobs = input.get("jobs", [])
    if not jobs:
        return 0

    # Greedy-style sweep over time points:
    # maintain best achievable weight up to each processed end time.
    # For a job [s,e,w], its candidate value is best weight available at time s plus w.
    # We process jobs by end time and advance a pointer over compressed times.
    times = sorted(set([0] + [s for s, _, _ in jobs] + [e for _, e, _ in jobs]))
    idx = {t: i for i, t in enumerate(times)}

    ending = [[] for _ in range(len(times))]
    for s, e, w in jobs:
        ending[idx[e]].append((idx[s], w))

    best = [0] * len(times)
    running = 0
    for t in range(len(times)):
        if t > 0 and best[t] < best[t - 1]:
            best[t] = best[t - 1]
        if best[t] > running:
            running = best[t]
        for s_idx, w in ending[t]:
            cand = best[s_idx] + w
            if cand > best[t]:
                best[t] = cand
        if best[t] < running:
            best[t] = running

    return best[-1]

Compare with Champion

Score Difference

-20.0%

Runtime Advantage

18μs slower

Code Size

31 vs 39 lines

#Your Solution#Champion
1def solve(input):1def solve(input):
2 jobs = input.get("jobs", [])2 if not isinstance(input, dict):
3 if not jobs:3 return 0
4 return 04 raw = input.get("jobs")
55 if not raw:
6 # Greedy-style sweep over time points:6 return 0
7 # maintain best achievable weight up to each processed end time.7
8 # For a job [s,e,w], its candidate value is best weight available at time s plus w.8 jobs = []
9 # We process jobs by end time and advance a pointer over compressed times.9 for j in raw:
10 times = sorted(set([0] + [s for s, _, _ in jobs] + [e for _, e, _ in jobs]))10 if isinstance(j, (list, tuple)) and len(j) == 3:
11 idx = {t: i for i, t in enumerate(times)}11 jobs.append((j[1], j[0], j[2])) # sort by end, store as (end, start, weight)
1212 if not jobs:
13 ending = [[] for _ in range(len(times))]13 return 0
14 for s, e, w in jobs:14
15 ending[idx[e]].append((idx[s], w))15 jobs.sort()
1616 ends = []
17 best = [0] * len(times)17 bests = []
18 running = 018
19 for t in range(len(times)):19 for e, s, w in jobs:
20 if t > 0 and best[t] < best[t - 1]:20 lo = 0
21 best[t] = best[t - 1]21 hi = len(ends)
22 if best[t] > running:22 while lo < hi:
23 running = best[t]23 mid = (lo + hi) >> 1
24 for s_idx, w in ending[t]:24 if ends[mid] <= s:
25 cand = best[s_idx] + w25 lo = mid + 1
26 if cand > best[t]:26 else:
27 best[t] = cand27 hi = mid
28 if best[t] < running:28
29 best[t] = running29 candidate = w + (bests[lo - 1] if lo else 0)
3030 current = bests[-1] if bests else 0
31 return best[-1]31
3232 if candidate > current:
3333 if ends and ends[-1] == e:
3434 bests[-1] = candidate
3535 else:
3636 ends.append(e)
3737 bests.append(candidate)
3838
3939 return bests[-1] if bests else 0
Your Solution
80% (4/5)36μs
1def solve(input):
2 jobs = input.get("jobs", [])
3 if not jobs:
4 return 0
5
6 # Greedy-style sweep over time points:
7 # maintain best achievable weight up to each processed end time.
8 # For a job [s,e,w], its candidate value is best weight available at time s plus w.
9 # We process jobs by end time and advance a pointer over compressed times.
10 times = sorted(set([0] + [s for s, _, _ in jobs] + [e for _, e, _ in jobs]))
11 idx = {t: i for i, t in enumerate(times)}
12
13 ending = [[] for _ in range(len(times))]
14 for s, e, w in jobs:
15 ending[idx[e]].append((idx[s], w))
16
17 best = [0] * len(times)
18 running = 0
19 for t in range(len(times)):
20 if t > 0 and best[t] < best[t - 1]:
21 best[t] = best[t - 1]
22 if best[t] > running:
23 running = best[t]
24 for s_idx, w in ending[t]:
25 cand = best[s_idx] + w
26 if cand > best[t]:
27 best[t] = cand
28 if best[t] < running:
29 best[t] = running
30
31 return best[-1]
Champion
100% (5/5)18μs
1def solve(input):
2 if not isinstance(input, dict):
3 return 0
4 raw = input.get("jobs")
5 if not raw:
6 return 0
7
8 jobs = []
9 for j in raw:
10 if isinstance(j, (list, tuple)) and len(j) == 3:
11 jobs.append((j[1], j[0], j[2])) # sort by end, store as (end, start, weight)
12 if not jobs:
13 return 0
14
15 jobs.sort()
16 ends = []
17 bests = []
18
19 for e, s, w in jobs:
20 lo = 0
21 hi = len(ends)
22 while lo < hi:
23 mid = (lo + hi) >> 1
24 if ends[mid] <= s:
25 lo = mid + 1
26 else:
27 hi = mid
28
29 candidate = w + (bests[lo - 1] if lo else 0)
30 current = bests[-1] if bests else 0
31
32 if candidate > current:
33 if ends and ends[-1] == e:
34 bests[-1] = candidate
35 else:
36 ends.append(e)
37 bests.append(candidate)
38
39 return bests[-1] if bests else 0