πЕГЭ · ИИ-репетитор12 предметов · задания ФИПИ
Главная → Информатика → Задания №24 → Задание i24-01

Задание №24 ЕГЭ Информатика с ответом и решением

Ответ: 35

Условие

Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны.

Для выполнения этого задания следует написать программу. Ниже приведён файл, который необходимо обработать с помощью данного алгоритма.

Файл с исходными данными к этому заданию в открытом банке не опубликован — разбирай подход по официальному решению ниже.

Подсказки — как подойти к решению

  1. Файл — сплошная строка из символов X, Y и Z, поэтому читай его целиком (или посимвольно) и следи, чтобы в данные не попал перевод строки в конце файла.
  2. Иди по строке за один проход, храня предыдущий символ, длину текущей цепочки k и максимум m: пока очередной символ отличается от предыдущего, цепочка продолжается, а при совпадении она обрывается и счёт начинается заново.
  3. Не забудь обновить максимум после выхода из цикла — самая длинная цепочка может оказаться в самом конце строки. Помни, что цепочка из одного символа тоже допустима, а при обрыве счётчик сбрасывается в 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;

}

}

Типичные ошибки

Решить это задание в тренажёре

В тренажёре: подсказки по шагам, разбор твоей ошибки ИИ-репетитором (он не даёт готовый ответ), повторение ошибок по интервалам и общий прогресс. Все задания №24 по информатике