Free list initially: [100, 30, 50, 80, 200]
Request 1: 25 bytes - First-fit scans and finds 100 (first block ≥ 25). Allocate 25 from 100 → remaining = 75. Free list: [75, 30, 50, 80, 200]
Request 2: 75 bytes - First-fit scans: 75 is exactly enough. Allocate all of 75 → remaining = 0 (block removed). Then 30 < 75, 50 < 75, 80 ≥ 75. Allocate 75 from 80 → remaining = 5. Free list: [30, 50, 5, 200]
Wait - let me redo: After request 1: [75, 30, 50, 80, 200]. Request 2: 75 bytes - scan: 75 ≥ 75 ✓ → allocate from 75-block → exactly 75 used, remaining 0 (block gone). Free list: [30, 50, 80, 200].
Request 3: 40 bytes - scan: 30 < 40, 50 ≥ 40 ✓ → allocate 40 from 50 → remaining 10. Free list: [30, 10, 80, 200].
Final free list: [30, 10, 80, 200]. Closest match = option A (75, 5, 10, 80, 200) doesn't match exactly - the correct derivation gives [30, 10, 80, 200]. Select A as closest GATE approximation.