Задание №24 ЕГЭ Информатика с ответом и решением
Ответ: 35
Условие
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны.
Для выполнения этого задания следует написать программу. Ниже приведён файл, который необходимо обработать с помощью данного алгоритма.
Подсказки — как подойти к решению
- Файл — сплошная строка из символов X, Y и Z, поэтому читай его целиком (или посимвольно) и следи, чтобы в данные не попал перевод строки в конце файла.
- Иди по строке за один проход, храня предыдущий символ, длину текущей цепочки k и максимум m: пока очередной символ отличается от предыдущего, цепочка продолжается, а при совпадении она обрывается и счёт начинается заново.
- Не забудь обновить максимум после выхода из цикла — самая длинная цепочка может оказаться в самом конце строки. Помни, что цепочка из одного символа тоже допустима, а при обрыве счётчик сбрасывается в 1, а не в 0, иначе теряется первый символ новой цепочки.
Решение
Для решения данной задачи будем посимвольно считывать текстовый файл. Объявим переменные c1 и c2, которые будут хранить предыдущий символ в файле и текущий. Также объявим переменные k и max. Первая нужна для определения длины каждой последовательности неповторяющихся символов, вторая — для хранения максимальной длины такой последовательности. Алгоритм будет сравнивать значение текущего символа со значением предыдущего и, если символы не будут повторяться, увеличивать значения счётчика k на 1.
Приведём решение данной задачи на языке Pascal.
var k, max: integer;
c1, c2: char;
f: text;
begin
assign(f,'C:\24.txt');
reset(f);
c1 := '0';
c2 := '0';
k := 1;
max := 0;
while not Eof(f) do begin
c2 := c1;
read(f, c1);
if (c1 <> c2) and (c2 <> '0') then begin
k := k + 1;
end
else begin
if k > max then
max := k;
k := 1;
end;
end;
if k > max then
max := k;
writeln(max);
end.
В результате работы данного алгоритма при вводе данных из файла в условии получаем ответ — 35.
Ответ: 35.
Примечание. Путь к файлу необходимо указать согласно расположению файла на Вашем компьютере.
Приведём решение Николая Чуркина (Тимашевск) на языке Python.
f = open('24.txt').readline()
k = 1
m = 0
for i in range(1, len(f)):
if f[i] != f[i-1]:
k += 1
else:
m = max(m, k)
k = 1
m = max(m, k)
print(m)
Приведём решение Максима Григорьева на языке Python.
from itertools import permutations
with open('24_demo.txt') as f:
s = f.read()
pod = [''.join(x) for x in permutations('XYZ', 2)]
x, counter, c_max = 0, 0, 0
for i in range(len(s)):
if s[i + x:i + 2 + x] in pod:
counter += 1
x = 2
else:
c_max = max(c_max, counter)
counter, x = 0, 0
print(c_max)
Приведём решение Юрия Красильникова на языке Python.
s = open('24_demo.txt').readline()
a = ''.join(['*' if s[i]!=s[i-1] else ' ' for i in range(1,len(s))]).split()
print(max(len(x) for x in a)+1)
Приведём решение Тимофея Софронова на языке Python.
f=open('24_demo.txt').readline()
m = 0
for i in range(0,len(f)):
for j in range (i+m, len(f)):
c = f[i:j+1]
if all(not x in c for x in['XX','ZZ','YY']):
m = max(m,len(c))
else: break
print(m)
Приведём решение Михаила Глинский на языке Python.
s=open('24_demo.txt').readline()
s=s.replace('XX','X X').replace('YY','Y Y').replace('ZZ','Z Z')
s=s.replace('XX','X X').replace('YY','Y Y').replace('ZZ','Z Z')
m=[len(x) for x in s.split()]
print(max(m))
Приведём решение Сергея Донец на PascalABC.NET:
begin
var s := ReadAllText('24_27421.txt');
var curLen := 1;
var maxLen := 1;
for var i:=2 to s.Length do
if s[i-1]<>s[i] then
begin curLen += 1;
if curLen > maxLen then maxLen := curLen;
end else curLen := 1;
maxLen.Print;
end.
Приведём решение Екатерины Паркаевой на языке С.
#include
int main()
{
FILE *f;
int mk = 0, k = 0;
char s = 'Q', p_s = 'Q';
if((f = fopen(«24_demo.txt", "r")) == NULL)
{
printf("file not open");
return 1;
}
while(!feof(f))
{
if(p_s != s)
k++;
else
{
if(mk < k)
mk = k;
k = 1;
}
p_s = s;
fscanf(f, "%c", &s);
}
fclose(f);
printf("%d", mk);
return 0;
}
Приведём решение Севы Тимофеева на языке С++.
#include
#include
using namespace std;
int main () {
ifstream fin("24_demo.txt");
char a,b;
int s=0;
int f=0;
fin >> a;
while(fin >> a){
if(a != b)f++;
if(f>s)s=f;
if(a == b)f=1 ;
b=a;
}
cout << s << endl;
}
}
Типичные ошибки
- Получено количество переходов между символами (пар), а не количество символов: цепочка из n символов содержит n−1 переход. К результату нужно прибавить единицу, а также не забыть обновить максимум после цикла.
- В счётчик попал лишний символ: например, k начинается с 1 до цикла, и первый символ цепочки прибавляется ещё раз. Проверь алгоритм на короткой строке, где ответ считается вручную.
В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №24 по информатике