Сократите список интервалов (время начала и окончания), чтобы получить максимальное количество непересекающихся функций, которые мы можем посетить за день - PullRequest
0 голосов
/ 14 февраля 2019

Я создаю программу на Java 8, которая дает максимальное количество функций, которые человек может посещать за день.т.е. человек может присутствовать только в одной функции в любой заданный интервал времени.

Я пытался написать код, чтобы найти решение, но не смог найти, где я отстаю. Пожалуйста, помогите мне.

Пример ввода: 1 // Количество вводимых дней 5 // Количество функций в приемном дне 14:00 16:00 Принятие ребенка 12:00 14:30 Иннагурация 14:00 16:30 Свадьба 12: 30 13:30 politMeeting 13:30 15: 00

Пример / ожидаемый результат: 2

package problems.functionScheduler;

import static java.time.temporal.ChronoUnit.MINUTES;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class Solution {

    public class Interval {
        public LocalTime begin;
        public LocalTime end;

        public Interval(LocalTime begin, LocalTime end) {
            super();
            this.begin = begin;
            this.end = end;
        }

        public LocalTime getBegin() {
            return begin;
        }

        public void setBegin(LocalTime begin) {
            this.begin = begin;
        }

        public LocalTime getEnd() {
            return end;
        }

        public void setEnd(LocalTime end) {
            this.end = end;
        }

        public long timeDifference() {
            return MINUTES.between(begin, end);
        }

    }

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        Solution solutionObject = new Solution();
        int t = scanner.nextInt();
        IntStream.rangeClosed(1, t).forEach(i -> {
            // System.out.println("This is the " + i + "th iteration :");
            List<Interval> intervalList = new ArrayList<>();
            int n = scanner.nextInt();
            scanner.nextLine();
            IntStream.rangeClosed(1, n).forEach(j -> {
                // System.out.println("This is the " + j + "th value from the " + i + "th
                // iteration :");
                String[] values = scanner.nextLine().split("\\s+");
                // System.out.println(values[0]);
                // System.out.println(values[1]);
                // System.out.println(values[2]);
                intervalList.add(solutionObject.new Interval(LocalTime.parse(values[1]), LocalTime.parse(values[2])));
            });

            // sorting the list
            List<Interval> temp = intervalList.stream()
                    .filter(interval -> !interval.getBegin().equals(interval.getEnd()))
                    .sorted(Comparator.comparing(Interval::timeDifference))
//                  .sorted(Comparator.comparing(Interval::getBegin))
//                  .sorted(Comparator.comparing(Interval::getEnd))
                    .collect(Collectors.toList());

//          calculateMaxCount(temp.get(0), temp.subList(1, temp.size()));

            List<Interval> temp1 = temp;

            System.out.println(calculateMaximumCount(temp, temp1));

//          temp.forEach(inte -> System.out.println("The begin is "+inte.getBegin()+" and the end is "+inte.getEnd()));

//          temp.stream().reduce(new Interval(LocalTime.parse("00:00", "00:00")), (int1, int2) -> Solution.isOverlapping(int1, int2));
//          new Interval(LocalTime.parse("00:00"), LocalTime.parse("00:00"));

        });
    }

    private static int calculateMaximumCount(List<Interval> temp, List<Interval> temp1) {
        int maximumCount = 0;
        for (int m = 0; m < temp.size(); m++) {
            int count = 0;
            for (int l = m + 1; l < temp1.size(); l++) {
                if (isNotOverlapping(temp.get(m), temp1.get(l))) {
                    count++;
                }
            }
            if (count > maximumCount) {
                maximumCount = count;
            }
        }
        return maximumCount;
    }

    private static boolean isNotOverlapping(Interval interval1, Interval interval2) {
        return !interval2.getBegin().isBefore(interval1.getEnd());
    }
}

Пример ввода: 1 // Количество вводимых дней 5 // Количество функций в приемной день 14:00 16:00 Принятие ребенка 12:00 14:30 Иннагурация 14:00 16:30 Свадьба 12:30 13:30 Политическая встреча 13:30 15:00

Образец / ожидаемый результат: 2

...