Задания
Версия для печати и копирования в MS Word

Тек­сто­вый файл со­дер­жит толь­ко за­глав­ные буквы ла­тин­ско­го ал­фа­ви­та (ABCZ). Опре­де­ли­те мак­си­маль­ное ко­ли­че­ство иду­щих под­ряд сим­во­лов, среди ко­то­рых не более одной буквы D.

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

За­да­ние 24

Спрятать решение

Ре­ше­ние.

Будем по­сим­воль­но счи­ты­вать файл. Каж­дую ите­ра­цию цикла while будем уве­ли­чи­вать счётчик k на еди­ни­цу и ис­поль­зо­вать её как ин­декс. Если оче­ред­ной счи­тан­ный сим­вол не яв­ля­ет­ся бук­вой D  — будем уве­ли­чи­вать счётчик count на еди­ни­цу. Также будем про­ве­рять, боль­ше ли те­ку­щее зна­че­ние счётчика count зна­че­ния пе­ре­мен­ной maxlen. Если усло­вие вы­пол­ня­ет­ся, будем об­нов­лять зна­че­ние пе­ре­мен­ной maxlen  — это ис­ко­мое зна­че­ние.

Если будет встре­че­на буква D, будем про­ве­рять, встре­че­на ли она в пер­вый раз. Если до этого букв D в те­ку­щей по­сле­до­ва­тель­но­сти не встре­ча­лось, будем за­по­ми­нать те­ку­щую по­зи­цию буквы D и про­дол­жать уве­ли­чи­вать зна­че­ние счётчика count. Если буква D в те­ку­щей по­сле­до­ва­тель­но­сти встре­ча­ет­ся во вто­рой раз, будем при­сва­и­вать зна­че­нию счётчика count раз­ность те­ку­щей ите­ра­ции цикла while и ин­дек­са пер­вой встре­чен­ной буквы D  — таким об­ра­зом будем учи­ты­вать и по­сле­до­ва­тель­ность, на­чав­шу­ю­ся от преды­ду­щей встре­чен­ной буквы D. Также в этом слу­чае об­но­вим зна­че­ние пе­ре­мен­ной i, от­ве­ча­ю­щей за хра­не­ние ин­дек­са по­след­ней встре­чен­ной буквы D.

 

При­ведём ре­ше­ние дан­ной за­да­чи на языке PascalABC.

var

i, count, maxlen, countD, k: integer;

c: char;

f: text;

begin

assign(f,'C:\24.txt');

reset(f);

maxlen := 0;

count := 0;

countD := 0;

k := 0;

while not eof(f) do begin

read(f, c);

k := k + 1;

if c <> 'D' then begin

count := count + 1;

if count > maxlen then maxlen := count;

end

else if countD = 0 then begin

countD := 1;

i := k;

count := count + 1;

if count > maxlen then maxlen := count;

end

else if countD = 1 then begin

count := k - i;

i := k;

if count > maxlen then maxlen := count;

end;

end;

writeln(maxlen);

end.

 

При­ведём ре­ше­ние дан­ной за­да­чи на языке Python.

f = open('24.txt')

s = f.readline()

 

k = []

mx = 0

 

for i in range(len(s)):

if s[i] == 'D':

k.append(i)

 

for j in range(len(k) - 2):

c = k[j + 2] - k[j] - 1

mx = max(mx ,c)

print(mx)

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла в усло­вии по­лу­ча­ем ответ  — 354.

 

Ответ: 354.

 

При­ме­ча­ние. Путь к файлу не­об­хо­ди­мо ука­зать со­глас­но рас­по­ло­же­нию файла на Вашем ком­пью­те­ре.

 

При­ведём дру­гое ре­ше­ние Ма­ло­ва Ни­ки­ты на языке Python.

f = open('24.txt')

a = f.readline().split('D')

m = 0

for i in range(len(a) - 1):

m = max(m,len(a[i])+len(a[i+1])+1)

print(m)


Аналоги к заданию № 38958: 39253 Все

Раздел кодификатора ФИПИ: