-
Notifications
You must be signed in to change notification settings - Fork 0
/
1i-schedule.js
144 lines (114 loc) · 7.79 KB
/
1i-schedule.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
I. Расписание
Ограничение времени 1 секунда (фактическое использование на тестах – до 50ms)
Ограничение памяти 64Mb (фактическое использование на тестах – до 5.66Mb)
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Как же Илье надоело учиться! Сначала школа, потом университет... Вот, наконец, наступил тот долгожданный день, когда Илье утром не надо ехать на учебу. Но, к несчастью для Ильи, оказалось, что после окончания университета начинается самое трудное — надо устраиваться на работу.
Во всемирно известной фирме «Goondex», в которую устроился Илья, принято очень много работать, в частности, для сотрудников установлена шестидневная рабочая неделя. Но, в качестве бонуса, «Goondex» каждый год предлагает своим сотрудникам выбрать любой день недели в качестве выходного. В свою очередь, оставшиеся шесть дней недели будут рабочими.
Илья сообразил, что с учётом государственных праздников (которые всегда являются выходными) с помощью правильного выбора выходного дня недели можно варьировать количество рабочих дней в году. Теперь он хочет знать, какой день недели ему следует выбрать в качестве выходного, чтобы отдыхать как можно больше дней в году, или, наоборот, демонстрировать чудеса трудолюбия, работая по максимуму.
Формат ввода
В первой строке входных данных находится одно целое число N (0 ≤ N ≤ 366) — количество государственных праздников.
Во второй строке содержится одно целое число year (1800 ≤ year ≤ 2100) — год, в который необходимо помочь Илье.
В каждой из последующих N строк расположено по паре чисел day month (day — целое число, month — слово, между day и month ровно один пробел), обозначающих, что день day месяца month является государственным праздником.
В последней строке расположено слово — день недели первого января в год year.
Гарантируется, что все даты указаны корректно (в том числе указанный день недели первого января действительно является днём недели первого января соответствующего года year) и все дни государственных праздников различны.
Формат вывода
Выведите через пробел два дня недели — лучший и худший варианты дней недели для выходного (то есть дни недели, для которых достигается соответственно максимальное и минимальное количество выходных дней в году). Если возможных вариантов ответа несколько, выведите любой из них.
Пример 1
Ввод
2
2015
1 January
8 January
Thursday
Вывод
Monday Thursday
Пример 2
Ввод
3
2013
1 January
8 January
15 January
Tuesday
Вывод
Monday Tuesday
Пример 3
Ввод
3
2013
6 February
13 February
20 February
Tuesday
Вывод
Tuesday Wednesday
Примечания
Рассмотрим подробно третий пример.
2013 год начинается и заканчивается во вторник (Tuesday), при этом на вторник приходится 53 дня года, а на все остальные дни недели — по 52 дня. Все три государственных праздника выпадают на среду (Wednesday). Если Илья выберет в качестве выходного дня вторник, то в году у него будет 53 + 3 = 56 выходных дней (53 вторника и 3 государственных праздника). Если Илья выберет в качестве выходного дня среду, то у него будет только 52 выходных дня. Если же Илья выберет в качестве выходного дня любой другой день недели, то у него будет 52 + 3 = 55 выходных дней.
Таким образом, лучший вариант для выходного дня — вторник, худший — среда, и единственным правильным ответом в данном примере является Tuesday Wednesday.
В феврале 29 дней только в високосные года. Год является високосным, если он кратен 400, либо кратен 4 и не кратен 100. Например, 1996 и 2000 являются високосными, а 1999 и 1900 — нет.
*/
const fs = require('fs');
const input = fs.readFileSync('input.txt', 'utf8').toString().trim().split('\n');
const holidaysCount = parseInt(input[0]);
const year = parseInt(input[1]);
const isLeapYear = year % 400 === 0 || (year % 4 === 0 && year % 100 !== 0);
const firstDayOfWeekName = input[2 + holidaysCount];
const daysOfWeekIndexes = {
Sunday: 0,
Monday: 1,
Tuesday: 2,
Wednesday: 3,
Thursday: 4,
Friday: 5,
Saturday: 6,
};
const daysOfWeekNames = [
'Sunday',
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
];
const daysOfWeekCount = [
52,
52,
52,
52,
52,
52,
52,
];
const firstDayOfWeekIndex = daysOfWeekIndexes[firstDayOfWeekName];
++daysOfWeekCount[firstDayOfWeekIndex];
if (isLeapYear) {
const secondDayOfWeekIndex = (firstDayOfWeekIndex + 1) % 7;
++daysOfWeekCount[secondDayOfWeekIndex];
}
for (let i = 0; i < holidaysCount; ++i) {
const [day, month] = input[i+2].trim().split(' ');
const date = new Date(`${month} ${day}, ${year}`);
const dayOfWeekIndex = date.getDay();
if (daysOfWeekCount[dayOfWeekIndex]) {
--daysOfWeekCount[dayOfWeekIndex];
}
}
let bestDayOfWeekForHolidayName = daysOfWeekNames[0];
let bestDayOfWeekForHolidayCount = daysOfWeekCount[0];
let worstDayOfWeekForHolidayName = daysOfWeekNames[0];
let worstDayOfWeekForHolidayCount = daysOfWeekCount[0];
for (let i = 1; i < 7; ++i) {
if (bestDayOfWeekForHolidayCount < daysOfWeekCount[i]) {
bestDayOfWeekForHolidayCount = daysOfWeekCount[i];
bestDayOfWeekForHolidayName = daysOfWeekNames[i];
}
if (worstDayOfWeekForHolidayCount > daysOfWeekCount[i]) {
worstDayOfWeekForHolidayCount = daysOfWeekCount[i];
worstDayOfWeekForHolidayName = daysOfWeekNames[i];
}
}
fs.writeFileSync('output.txt', `${bestDayOfWeekForHolidayName} ${worstDayOfWeekForHolidayName}`);