Java. Олимпиадное программирование. ACMP номер 184

240
11 января 2019, 10:50

Не проходит 2ой тест в задаче 184, что за тест - неизвестно(Рабочее время). Программа на Java, прокомментировал некоторые моменты.
Тест в примере проходит.
Кастомный тест тоже проходит:
6 18.11. 15:13 29.05. 13:27 18.06. 15:13 18.06. 10:27 18.12. 10:19 03.11. 15:42
Ответ: 1496:38 Сама программа:

package com.company.Sort;
import java.util.*;
import java.io.*;
public class WorkTime {
    public static void main(String[] args) throws IOException {
        Scanner scan = new Scanner(new File("input.txt"));
        PrintWriter pw = new PrintWriter(new File("output.txt"));
        int K = scan.nextInt();
        scan.nextLine();
        Integer[][] lists = new Integer[K][4];
        for (int i = 0; i < K; i++){ // парсинг input.txt в двумерный массив. Структура: 0 - день; 1 - месяц; 2 - час; 3 - минута
            String[] sinp = scan.nextLine().split("\\. |:|\\.| ");
            int input[] = Arrays.stream(sinp).mapToInt(Integer::parseInt).toArray();
            lists[i][0] = input[0];
            lists[i][1] = input[1];
            lists[i][2] = input[2];
            lists[i][3] = input[3];
        }
        lists = Arrays.stream(lists).sorted((x1,x2) -> { // сортировка по возрастанию даты
            if (x1[1] != x2[1]){
                return x1[1] - x2[1];
            } else if (x1[0] != x2[0]){
                return x1[0] - x2[0];
            } else {
                if (x1[2] != x2[2])
                    return x1[2] - x2[2];
                else
                    return x1[3] - x2[3];
            }
        }).toArray(Integer[][]::new);
        int middle; // дни между первым и последним (если есть)
        int[] days_per_month = {31,28,31,30,31,30,31,31,30,31,30,31}; // кол-во дней в месяцах года
        Integer[] prev_note; // заметка первого дня (просто инфа о первом дне, с той же структурой даты и времени )
        Integer[] next_note; // заметка последнего дня
        int total_min = 0;
        int prev_day;
        int next_day;
        // Структура: 0 - день; 1 - месяц; 2 - час; 3 - минута
        for (int i = 0; i < lists.length; i+=2){
            middle = 0; // дни между первым и последним (если есть)
            prev_note = lists[i];
            next_note = lists[i+1];
            prev_day = 18*60 - (prev_note[2]*60 + prev_note[3]) + 1; // кол-во часов в первый день
            next_day = (next_note[2] - 10)*60 + next_note[3]; // в последний
            if (prev_note[1] != next_note[1]) { // если в разных месяцах, учитывается middle
                for (int j = prev_note[1]; j <= next_note[1]; j++) {
                    if (j == prev_note[1])
                        middle += days_per_month[j - 1] - prev_note[0];
                    else if (j == next_note[1])
                        middle += next_note[0] - 1;
                    else
                        middle += days_per_month[j - 1];
                }
                total_min += middle * 8 * 60;
                total_min += prev_day + next_day;
            } else { // если в одном месяце
                if (prev_note[0] != next_note[0]) {  // если в разных днях
                    total_min += (next_note[0] - prev_note[0] - 1) * 8;
                    total_min += prev_day + next_day;
                }
                else  //один день
                    total_min += next_note[2] * 60 + next_note[3] - prev_note[2] * 60 - prev_note[3];
            }
        }
        int hours = total_min / 60;
        int min = total_min - hours * 60;
        pw.print(hours + ":" + ((min < 10) ? "0" + min: min) );
        pw.close();
    }
}

UPD: Если вам не нравится то, как написан код, или, допустим, где-нибудь можно было сделать короче - пишите, буду благодарен.

READ ALSO
Ускорение работы рекурсивного метода

Ускорение работы рекурсивного метода

Дан метод на JavaДанный метод рекурсивный, выполняет функцию поиска непересекающихся прямоугольников из списков ArrayList

255
Шифр блочной одинарной перестановки Java

Шифр блочной одинарной перестановки Java

Только начал изучать Java, столкнулся с такой проблемойНеобходимо написать алгоритм блочной перестановки

214
ошибка при использовании EnvelopedSignature.open (error msg: &ldquo;output cipher initiation failed&rdquo;)

ошибка при использовании EnvelopedSignature.open (error msg: “output cipher initiation failed”)

Реализую шифрование сообщения с использованием класса EnvelopedSignature

232
Как использовать спринг-бины в expressions в Activiti (ServiceTask)?

Как использовать спринг-бины в expressions в Activiti (ServiceTask)?

Не получается использовать бины в выражения в Activiti (в ServiceTask)Он пишет, что не видит этот бин

184