Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.HashSet;
- public class PageLayout {
- private static ArrayList<HashSet<Integer>> fitting_stories;
- private static int[] areas;
- private static int N;
- public static void main(String[] args) {
- Kattio kat = new Kattio(System.in);
- while (true) {
- N = kat.getInt();
- if (N == 0)
- break;
- ArrayList<int[]> stories = new ArrayList<>();
- for (int i = 0; i < N; i++) {
- int[] line = new int[4];
- line[0] = kat.getInt();
- line[1] = kat.getInt();
- line[2] = kat.getInt();
- line[3] = kat.getInt();
- stories.add(line);
- }
- areas = new int[N];
- for (int i = 0; i < N; i++) {
- areas[i] = story_size(stories.get(i));
- }
- fitting_stories = new ArrayList<>();
- for (int i = 0; i < N; i++) {
- fitting_stories.add(new HashSet<>());
- }
- for (int i = 0; i < N; i++) {
- fitting_stories.get(i).add(i);
- for (int j = i + 1; j < N; j++) {
- if (fit_together(stories.get(i), stories.get(j))) {
- fitting_stories.get(i).add(j);
- fitting_stories.get(j).add(i);
- }
- }
- }
- kat.println(opti_page(0, 0));
- kat.flush();
- }
- }
- static int story_size(int[] story) {
- return story[0] * story[1];
- }
- static boolean fit_together(int[] story1, int[] story2) {
- int w1 = story1[0];
- int h1 = story1[1];
- int x1 = story1[2];
- int y1 = story1[3];
- int w2 = story2[0];
- int h2 = story2[1];
- int x2 = story2[2];
- int y2 = story2[3];
- if (x1 < x2) {
- if (x1 + w1 > x2) {
- if (y1 < y2) {
- if (y1 + h1 > y2) {
- return false;
- }
- } else if (y2 < y1) {
- if (y2 + h2 > y1) {
- return false;
- }
- } else {
- return false;
- }
- }
- } else if (x2 < x1) {
- if (x2 + w2 > x1) {
- if (y1 < y2) {
- if (y1 + h1 > y2) {
- return false;
- }
- } else if (y2 < y1) {
- if (y2 + h2 > y1) {
- return false;
- }
- } else {
- return false;
- }
- }
- } else {
- if (y1 < y2) {
- if (y1 + h1 > y2) {
- return false;
- }
- } else if (y2 < y1) {
- if (y2 + h2 > y1) {
- return false;
- }
- } else {
- return false;
- }
- }
- return true;
- }
- static int opti_page(int current_story, int current_page) {
- if (current_story == N)
- return 0;
- int prev_area = opti_page(current_story + 1, current_page);
- for (int j = 0; j < current_story; j++) {
- if ((current_page >> j) % 2 == 1) {
- if (!fitting_stories.get(j).contains(current_story)){
- return prev_area;
- }
- }
- }
- int new_area = opti_page(current_story + 1, current_page | 1 << current_story) + areas[current_story];
- if (new_area > prev_area) {
- return new_area;
- } else {
- return prev_area;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement