Форум » Циклы и ветвления » 6 задание (№ 4806) » Ответить

6 задание (№ 4806)

Ygrek: Подскажите, чего я не вижу в диапазоне???? [pre2] [pre]for i in range(1,355000000): x = i n = 987 while (x+n)//1000 < 354261: x = x - 5 n = n + 8 if (n//1000)==231: print(i)[/pre] [/pre2]

Ответов - 11

Винникова: Ygrek пишет: Подскажите, чего я не вижу в диапазоне???? Нижней границы)) Поднимите ее

Ygrek: Винникова пишет: Нижней границы)) Поднимите ее Все равно не эффективно( Как ускорить?

Винникова: Ygrek пишет: Как ускорить? Рассчитать х и сдвигая границы определить диапазон. Раньше, до КЕГЭ, так и делали, а в нынешних условиях задача стала очень простой, не требуется проводить анализ программы, вот и придумали изменить так, чтобы все-таки нужно было проанализировать, иначе по времени не проходит.


Ygrek: Винникова пишет: Рассчитать х и сдвигая границы определить диапазон. Спасибо [pre] k=0 for i in range(354173385,354173760): x = i n = 987 while (x+n)//1000 < 354261: x = x - 5 n = n + 8 #print(i,x,n) if (n//1000)==231: k=k+1 print(k) [/pre]

maryar: Винникова, подскажите, пожалуйста как вы нашли диапозон в этом задании.

Винникова: maryar пишет: подскажите, пожалуйста как вы нашли диапозон в этом задании. Двигаемся с конца. Чтобы результат равнялся 231, n = 231 * 1000 = 231000 n = 987 + 8*k = 231000 (k -количество итераций, с шагом 8 меняется n) k = 28752 x+n = 354261 * 1000 (x + n) + 3*28752 = 354261000 (шаг суммы x + n равен 3 (-5+8)) x + n = 354174744 x = 354174744 - 987 = 354173757 От этого числа двигаем границы в обе стороны, пока получаем результат.

maryar: Огромное, спасибо.

SergeyK: Понимать алгоритм необходимо, но можно ограничиться приблизительным расчетом верхней границы, например, так: [pre2] cnt = 0 for i in range(354261000, 1, -1): x = i #x = int(input()) n = 987 while (x+n)//1000 < 354261: if n//1000 < 228: x = x - 500 n = n + 800 #elif n//1000 > 231: break else: x = x - 5 n = n + 8 if n // 1000 == 231: cnt += 1 if n // 1000 > 231: break print(cnt) [/pre2]

ganilova: Спасибо, за решение, мне кажется оно наиболее простое и понятное. В данном решении я бы поставила в условии if n//1000 < 228: условие if n//1000 < 230: т.к. 500+800=1300, а 1300 // 1000 = 1, т.е. шаг на 1, иногда на 2, поэтому меньше 230, а не меньше 231 кажется, что так логичнее объяснить что это за условие.

konyashkind: Уважаемые коллеги! Осмелюсь предложить такое решение, самая большая проблема – не могу его обосновать. Буду благодарен если вы его подтвердите или опровергнете. Вводим следующие обозначения: Nmin – минимальное значение n при котором программа печатает нужное число Nmax - максимальное значение n при котором программа печатает нужное число Kmax – количество циклов для получения Nmax из Ns Kmin - количество циклов для получения Nmin из Ns Ns – стартовое значение n из условия задачи D – разница между увеличением n и уменьшением x P – значение суммы n и x при котором прекращается выполнение цикла Xmax – стартовое значение x при котором сумма Nmin и x равняется P Xmin – стартовое значение x при котором сумма Nmax и x равняется P Тогда получается следующее: Минимальное значение х равно Xmin Максимальное значение х равно Xmax + D – 1 Количество х равно (Kmax – Kmin + 1) * D

Поляков: konyashkind пишет: Xmax – стартовое значение x при котором сумма Nmin и x равняется P Xmin – стартовое значение x при котором сумма Nmax и x равняется P Это неверно, потому что мы идем с шагом D, поэтому остановка цикла может произойти при D различных значениях суммы x+n. Для данной задачи P может быть 354261000..354261002. Вторая (наиболее важная) неточность в этой формуле - значение x вы берете ДО цикла, а Nmin и Nmax - ПОСЛЕ цикла. Получается непонятно что. Количество х равно (Kmax – Kmin + 1) * D Это, по-видимому, правильно. Для каждого конечного значения n есть D значений x, при которых сумма x+n находится внутри отрезка 354261000..354261002.



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