На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Сообщение: 1
ссылка на сообщение  Отправлено: 09.06.23 20:02. Заголовок: 24 задача из апробации (8510)


Условие: Текстовый файл состоит из символов, обозначающих прописные буквы латинского алфавита.
Определите максимальное количество идущих подряд символов, среди которых никакие две буквы из набора букв N, O и P (с учетом повторений) не записаны подряд.
Файл здесь: https://kompege.ru/task?id=8510
Код писал на java, но логику я поясню:
Scanner scanner = new Scanner(System.in); //объявление сканера
String s = scanner.nextLine();//на java проще ввести строку через сканер, чем открывать через файл
int l = 0;//в этой переменной хранится длина текущей строки
int max = 0;//в этой переменной хранится максимальная длина строки
int flag = 0;//эта переменная является своеобразным маячком(флагом), далее по коды её значение раскроется
for (int i = 0; i < s.length(); i++) {//перебираем каждый элемент строки
if(s.charAt(i)=='N' | s.charAt(i)=='O' | s.charAt(i)=='P'){//если элемент с индексом i один из набора (N,0,P)
if(flag==1){//если флаг поднят, значит символ из набора встретился нам второй раз подряд
if(max<l)//если длина текущей строки превысила максимальную
max = l;//запишем значение текущей строки в максимальную
l=1;//длина текущей строки сбрасывается до одного элемента
}else{/если флаг не поднят, значит символ из набора встретился нам один раз, соседний символ не из набора
l++;//длина текущей строки увеличивается на один
flag = 1;//флаг поднимается, если следующий символ окажется из набора, нам придётся оборвать текущую строку
}
}else {//символ не из набора
l++;//увеличиваем текущую длину строки
flag = 0;//нет поводов поднимать флаг, если он был поднят прежде, его нужно опустить
}
}
System.out.println(max);//выводим на экран максимальное значение.
К коду можно придраться, потому что я проверяю максимальное значение только, когда обрубаю строку, если max длина будет в самом конце, программа её не считает. Однако, открыв файл и перемотав в конец, видно, что строка оканчивается на "PO", поэтому программа проверяет на max там где нужно.(в принципе, можно везде проверку на max поставить, ответ не изменится). Если запустить код, то получится ответ 50 при правильном 57. Помогите найти ошибку!

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 3 [только новые]





Сообщение: 2
ссылка на сообщение  Отправлено: 10.06.23 12:12. Заголовок: Небольшое дополнение


Эта задача с апробации очень похожа на задачу с досрока, вернее это она и есть, только с другим файлом и другим набором букв (На апробации были N, O, P - на досроке Q, R, S)
Ссылка на задачу с досрока: https://kompege.ru/task?id=7600
Ну так вот, мой код, который вы можете легко скопировать и убедиться самим, получает правильный ответ на задачу с досрока. Почему он не может получить правильный ответ на апробации я не понимаю. Вопросов стало еще больше.......

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 3
ссылка на сообщение  Отправлено: 10.06.23 16:46. Заголовок: Вопрос снимается


Короче, после анализа всего этого я во всём разобрался. Алгоритм верный, проблема в ограничениях среды. Количество символов в строке, которые мы считываем через сканер слишком велико. Если попробовать вывести значение длины строки, то получится сильно заниженное значение. Соответственно, если правильный ответ содержится ближе к началу строки, то программа его считает,если нет, то нет. Поэтому, к сожалению, решать 24 задачу на java не получится. Придётся наступить на горло и кодить на нелюбимом питоне

Спасибо: 0 
ПрофильЦитата Ответить



Сообщение: 4
ссылка на сообщение  Отправлено: 10.06.23 17:15. Заголовок: Код на питоне


Для тех кому нужно: код с той же логикой на питоне. Ответ получается правильный
s = open('24_1.txt').readline()
l = 0
max = 0
flag = 0
for i in range(0,len(s)):
if(s=='N' or s=='O' or s=='P'):
if(flag==1):
if(max<l):
max = l
l = 1
else:
l = l + 1
flag = 1
else:
l = l + 1
flag = 0
print(max)

Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 2296
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет