Задача 6147. Источник: Поляков. Задание КИМ 24
(В. Петров) Текстовый файл 24-250.txt состоит не более чем из 106 символов и содержит только заглавные буквы латинского алфавита и точки. Определите минимальное количество идущих подряд символов, среди которых ровно семь точек.
Решение
Создадим массив из шести элементов, где будем сохранять позиции последних шести точек. Встретив седьмую точку, анализируем длину строки на возможный минимум и обновляем содержимое массива позиций. В решении на PascalABC используется динамический массив и срезы, а в решении на C++ - vector, но возможно и решение на основе статического массива с переносом значений в цикле. Пример подобного решения можно посмотреть в задаче 6674.
Python
s = open('24-250.txt').readline()
mn = len(s)
last = [-1] * 6
for i in range(len(s)):
if s[i] == '.':
if last[0] != -1:
mn = min(mn, i - last[0] + 1)
del last[0]
last.append(i)
print(mn)
PascalABC
var
i, min: Integer;
s: String;
last: Array of Integer := ArrFill(6, 0);
f: TEXT;
begin
Assign(f, '24-250.txt');
Reset(f);
Readln(f, s);
min := s.Length;
for i := 1 to s.Length do
if s[i] = '.' then
begin
if (last[0] <> 0) and (i - last[0] + 1 < min) then
min := i - last[0] + 1;
last := last[1:] + Arr(i);
end;
Writeln(min);
end.
C++
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
int main()
{
ifstream f;
f.open("24-250.txt");
string s;
f >> s;
int min = s.length();
vector<int> last;
for (int i = 0; i < 6; i++)
last.push_back(-1);
for (int i = 0; i < s.length(); i++)
if (s[i] == '.')
{
if (last[0] != -1 && i - last[0] + 1 < min)
min = i - last[0] + 1;
last.erase(last.begin());
last.push_back(i);
}
cout << min << endl;
}
Ответ
16