private void doSchedule(Work work) { int driverNum = allocMap.length; int base = work.getWorkers() / driverNum; int extra = work.getWorkers() % driverNum; for (int i = 0; i < driverNum; i++) allocMap[i] = base; int lower = allocIdx; int upper = lower + extra; for (int i = lower; i < upper; i++) allocMap[i % driverNum]++; allocIdx = upper % driverNum; int idx = 0; int offset = 0; int workers = 0; for (DriverContext driver : drivers.values()) { if ((workers = allocMap[idx++]) == 0) continue; schedules.addSchedule(createSchedule(work, driver, offset, workers)); offset += workers; } }