-
Notifications
You must be signed in to change notification settings - Fork 0
/
2g-no-more-nor-less.js
95 lines (74 loc) · 3.93 KB
/
2g-no-more-nor-less.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
/*
G. Ни больше ни меньше
Ограничение времени 2 секунды (фактическое использование на тестах – до 116ms)
Ограничение памяти 256Mb (фактическое использование на тестах – до 17.82Mb)
Ввод стандартный ввод или input.txt
Вывод стандартный вывод или output.txt
Дан массив целых положительных чисел a длины n. Разбейте его на минимально возможное количество отрезков, чтобы каждое число было не меньше длины отрезка которому оно принадлежит. Длиной отрезка считается количество чисел в нем.
Разбиение массива на отрезки считается корректным, если каждый элемент принадлежит ровно одному отрезку.
Формат ввода
Первая строка содержит одно целое число t (1 ≤ t ≤ 1000) — количество наборов тестовых данных. Затем следуют t наборов тестовых данных.
Первая строка набора тестовых данных содержит одно целое число n (1 ≤ n ≤ 10^5) — длину массива.
Следующая строка содержит n целых чисел a[1], a[2], …, a[n] (1 ≤ a[i] ≤ n) — массив a.
Гарантируется, что сумма n по всем наборам тестовых данных не превосходит 2 ⋅ 10^5.
Формат вывода
Для каждого набора тестовых данных в первой строке выведите число k — количество отрезков в вашем разбиении.
Затем в следующей строке выведите k чисел len[1], len[2], …, len[k] — длины отрезков в порядке слева направо.
Пример
Ввод
3
5
1 3 3 3 2
16
1 9 8 7 6 7 8 9 9 9 9 9 9 9 9 9
7
7 2 3 4 3 2 7
Вывод
3
1 2 2
3
1 6 9
3
2 3 2
Примечания
Ответы в примере соответствуют разбиениям:
{[1], [3, 3], [3, 2]}
{[1], [9, 8, 7, 6, 7, 8], [9, 9, 9, 9, 9, 9, 9, 9, 9]}
{[7, 2], [3, 4, 3], [2, 7]}
В первом наборе тестовых данных набор длин {1, 3, 1}, соответствующий разбиению {[1], [3, 3, 3], [2]}, также был бы корректным.
*/
const fs = require('fs');
const input = fs.readFileSync('input.txt', 'utf8').toString().trim().split('\n');
const datasets = [];
let currentDatasetIndex = -1;
for (let i = 2; i < input.length; i = i + 2) {
const rangeString = input[i].trim() + ' ';
const rangeStringLength = rangeString.length;
datasets.push([]);
++currentDatasetIndex;
let number = 0;
let valueString = '';
let segmentLength = 0;
let minSegmentPart = Infinity;
for (let j = 0; j < rangeStringLength; ++j) {
if (rangeString[j] === ' ') {
number = parseInt(valueString);
if (number <= segmentLength || minSegmentPart <= segmentLength) {
datasets[currentDatasetIndex].push(segmentLength);
minSegmentPart = number;
segmentLength = 1;
} else {
if (number < minSegmentPart) {
minSegmentPart = number;
}
++segmentLength;
}
valueString = '';
} else {
valueString += rangeString[j];
}
}
datasets[currentDatasetIndex].push(segmentLength);
}
const output = datasets.map((dataset) => dataset.length + '\n' + dataset.join(' ')).join('\n');
fs.writeFileSync('output.txt', `${output}`);