TWO - Lập lịch trên 2 máy

Tác giả: RR

Ngôn ngữ: Java

import java.util.*;
import java.io.*;
import java.math.*;

class Job {
	int a, b, index;
	Job() {
	}
	Job(int a, int b, int i) {
		this.a = a;
		this.b = b;
		this.index = i;
	}
}

class JobComparatorA implements Comparator <Job> {
	public int compare(Job A, Job B) {
		if (A == null && B == null) return 0;
		if (A == null) return 1;
		if (B == null) return -1;
		if (A.a < B.a) return -1;
		else if (A.a > B.a) return 1;
		else return 0;
	}
}

class JobComparatorB implements Comparator <Job> {
	public int compare(Job A, Job B) {
		if (A == null && B == null) return 0;
		if (A == null) return 1;
		if (B == null) return -1;
		if (A.b > B.b) return -1;
		else if (A.b < B.b) return 1;
		else return 0;
	}
}

public class Main {
	public static int timeA = 0, timeB = 0;
	
	static void JobExecute(int a, int b) {
		timeA += a;
		timeB = Math.max(timeB, timeA) + b;
	}
	
	public static void main(String args[]) {
	try {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int n = Integer.parseInt(br.readLine()), n1 = 0, n2 = 0;
		Job[] list1 = new Job[n];
		Job[] list2 = new Job[n];
		
		String ta[] = br.readLine().split(" ");
		String tb[] = br.readLine().split(" ");
		
		for(int i = 0; i < n; i++) {
			int a = Integer.parseInt(ta[i]);
			int b = Integer.parseInt(tb[i]);
			if (a < b) list1[n1++] = new Job(a, b, i+1);
			else list2[n2++] = new Job(a, b, i+1);
		}
		
		Comparator <Job> c1 = new JobComparatorA();
		Comparator <Job> c2 = new JobComparatorB();
		Arrays.sort(list1, c1);
		Arrays.sort(list2, c2);
		
		for(int i = 0; i < n1; i++)
			JobExecute( list1[i].a, list1[i].b );
		for(int i = 0; i < n2; i++)
			JobExecute( list2[i].a, list2[i].b );
			
		System.out.println(timeB);
		for(int i = 0; i < n1; i++)
			System.out.print( list1[i].index + " " );
		for(int i = 0; i < n2; i++)
			System.out.print( list2[i].index + " " );
	}
	catch (Exception e) {
	}
	}
}

Download