• вывод стандартный
    вывод стандартный

    Вова выиграл в олимпиадах n кубков. Каждый кубок либо золотой, либо серебряный. Все кубки расположены в ряд один за другим. Красотой расположения кубков Вова называет длину максимального подотрезка из золотых кубков. Вова хочет поменять местами не более одной пары кубков (не обязательно соседних) так, чтобы сделать расположение кубков максимально красивым — максимизировать длину наибольшего подотрезка из золотых кубков. Помогите Вове! Сообщите, какую максимальную длину наибольшего подотрезка из золотых кубков он может получить, поменяв местами не более одной пары кубков. Входные данные Первая строка содержит число n (2≤n≤105) — количество выигранных Вовой кубков. Вторая строка содержит последовательность из n символов G и S. Если i-й символ равен G, то i-й кубок золотой, иначе — серебряный. Выходные данные В единственной строке выведите максимальную длину наибольшего подотрезка из золотых кубков, которую Вова может получить, поменяв местами не более одной пары кубков.



    тесты:
    ввод:
    10
    GGGSGGGSGG

    вывод:
    7

Ответы 3

  • var n,i,k,p,mk,mx: integer; s: array[1..100000] of char;begin readln(n); for i:=1 to n do read(s[i]); k:=0; p:=0; mx:=0; mk:=0; for i:=1 to n do begin if s[i]='G' then k:=k+1 else begin if p=1 then begin if s[i-1]='G' then begin if (k>mx) then mx:=k; k:=k-mk; mk:=k; end else begin k:=0; mk:=0; p:=0; end; end else if k>0 then begin p:=1; mk:=k; if k>mx then mx:=k; end; end; end; k:=max(k,mx)+1; if k=1 then k:=0; writeln(k);end.
    • Автор:

      marina64
    • 5 лет назад
    • 0
  • Это исправленный вариант. В предыдущем не учитывалось, если самая длинная последовательность в конце.
    • Автор:

      spicylfzo
    • 5 лет назад
    • 0
  • Если будете сдавать в тестирующей системе, то вместо string, лучше использовать массив char - работает быстрее.

    var n,i,k,p,mx,mxj: integer;

       s: array[1..100000] of char;

    begin

     readln(n);

     for i:=1 to n do read(s[i]);

     k:=0; p:=0;

     mx:=0; mxj:=0;

     for i:=1 to n do

     begin

       if s[i]='G' then k:=k+1

       else

       begin

         if p=1 then

         begin

           p:=0;

           if s[i-1]='G' then  

           if (k>mxj) then mxj:=k;

           k:=0;

         end

         else

         begin

           if k>0 then p:=1;

           if k>mx then mx:=k;

         end;

       end;  

     end;

     if mx>mxj then k:=mx+1

     else k:=mxj+1;

     if k=1 then k:=0;

     writeln(k);

    end.

  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years