package com.interview.algorithms.general;
import com.interview.basics.sort.QuickSorter;
import com.interview.basics.sort.Sorter;
/**
* Created with IntelliJ IDEA.
* User: stefanie
* Date: 8/28/14
* Time: 4:46 PM
*
* Have M memory, given a set of task, each have need request R[i] memory for handling, and O[i] memory to store the result (O[i] < R[i]).
* Write code to assign the task as a sequence to make sure all the task can be done,
* return a empty assignment if whatever sequence can't be fulfill these requirement. [Google]
* There assume the task can only be done in sequence, not parallel.
*
* This is a typical scenario for Banker's Algorithm, which is designed to avoid deadlock problem.
* http://blog.csdn.net/orange_os/article/details/7417204
* Here give a very quick solution:
* 1. sort the task by their output memory and diff memory as the task seq.
* 2. scan seq to check if M can fulfill the seq.
*/
public class C1_52_TaskAssignment {
static Sorter<Task> SORTER = new QuickSorter<Task>();
static class Task implements Comparable<Task> {
int number;
Integer request;
Integer output;
Integer diff;
Task(int number, Integer request, Integer output) {
this.number = number;
this.request = request;
this.output = output;
this.diff = request - output;
}
@Override
public int compareTo(Task task) {
if(output == task.output){
return diff.compareTo(task.diff);
} else return output.compareTo(task.output);
}
}
public static int[] assign(int M, int[] request, int[] output) {
Task[] tasks = new Task[request.length];
for (int i = 0; i < request.length; i++) tasks[i] = new Task(i, request[i], output[i]);
SORTER.sort(tasks);
int[] seq = new int[request.length];
for (int i = 0; i < tasks.length; i++) {
if (M < tasks[i].request) return new int[0];
seq[i] = tasks[i].number;
M -= tasks[i].output;
}
return seq;
}
}