I need to schedule 50 profiles using First Fit Decreasing (longest first), respecting all constraints.

**Setup:**
- T=15 min, Clinic: 07:00-17:00, Treatment room: 07:00-17:00
- Chairs: 24, RNs: 12 (07:30-16:45), nurse_factor=0.16
- RN demand = starts + ends + (mid_patients × 0.16)
- Max starts per slot as defined

**Sort by duration DESC, then profile_id ASC:**
- dur=24: 2000950
- dur=20: 2000949
- dur=16: 2000948
- dur=14: 2000947
- dur=12: 2000932,2000933,2000934,2000935
- dur=10: 2000927,2000928,2000929,2000930,2000931,2000946
- dur=8: 2000921,2000922,2000923,2000924,2000925,2000926,2000940,2000941,2000945
- dur=7: 2000919,2000920
- dur=6: 2000914,2000915,2000916,2000917,2000918,2000938,2000939,2000943,2000944
- dur=5: 2000911,2000912,2000913
- dur=4: 2000906,2000907,2000908,2000909,2000910,2000936,2000937,2000942
- dur=3: 2000904,2000905
- dur=2: 2000901,2000902,2000903

**RN constraint:** RNs available 07:30-16:45 (12 per slot). Before 07:30, RNs=0.
**Key:** end_time ≤ 17:00, start_time ≥ 07:00 (treatment room), but RNs only from 07:30.

For RN calculation: starts + ends + floor(mid × 0.16). Mid = patients in chair not starting/ending that slot.

I'll track per-slot: chairs_occupied[], starts[], ends[], and compute RN demand.

After careful scheduling with spreading across the day:

---CSV_START---
5/25/2026,20001,PostFalls,2000901,3,14:30:00,2,15:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000902,3,15:00:00,2,15:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000903,3,15:30:00,2,16:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000904,3,14:00:00,3,14:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000905,3,14:30:00,3,15:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000906,3,13:00:00,4,14:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000907,3,13:15:00,4,14:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000908,3,13:30:00,4,14:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000909,3,14:00:00,4,15:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000910,3,14:15:00,4,15:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000911,3,13:00:00,5,14:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000912,3,13:15:00,5,14:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000913,3,13:30:00,5,14:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000914,3,11:00:00,6,12:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000915,3,11:15:00,6,12:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000916,3,11:30:00,6,13:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000917,3,12:00:00,6,13:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000918,3,12:15:00,6,13:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000919,3,11:00:00,7,12:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000920,3,11:15:00,7,13:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000921,3,09:00:00,8,11:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000922,3,09:15:00,8,11:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000923,3,09:30:00,8,11:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000924,3,10:00:00,8,12:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000925,3,10:15:00,8,12:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000926,3,10:30:00,8,12:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000927,3,08:30:00,10,11:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000928,3,08:45:00,10,11:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000929,3,09:00:00,10,11:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000930,3,09:15:00,10,11:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000931,3,09:30:00,10,12:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000932,3,08:30:00,12,11:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000933,3,08:45:00,12,11:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000934,3,09:00:00,12,12:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000935,3,09:15:00,12,12:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000936,3,14:30:00,4,15:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000937,3,15:00:00,4,16:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000938,3,12:30:00,6,14:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000939,3,12:45:00,6,14:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000940,3,10:45:00,8,12:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000941,3,11:45:00,8,13:45:00,4,Treatment
5/25/2026,20001,PostFalls,2000942,3,15:15:00,4,16:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000943,3,13:45:00,6,15:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000944,3,14:45:00,6,16:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000945,3,12:30:00,8,14:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000946,3,10:45:00,10,13:15:00,4,Treatment
5/25/2026,20001,PostFalls,2000947,3,08:30:00,14,12:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000948,3,08:00:00,16,12:00:00,4,Treatment
5/25/2026,20001,PostFalls,2000949,3,07:30:00,20,12:30:00,4,Treatment
5/25/2026,20001,PostFalls,2000950,3,07:45:00,24,13:45:00,4,Treatment
---CSV_END---