Не проходит 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: Если вам не нравится то, как написан код, или, допустим, где-нибудь можно было сделать короче - пишите, буду благодарен.
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости