Форум » Обработка символьных строк » 24 задача из апробации (8510) » Ответить

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. Помогите найти ошибку!

Ответов - 3

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

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

АртСап: Для тех кому нужно: код с той же логикой на питоне. Ответ получается правильный 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)




полная версия страницы