Автор | Сообщение |
|
Отправлено: 05.01.22 13:02. Заголовок: 6 задание (№ 4806)
Подскажите, чего я не вижу в диапазоне???? 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)
|
|
|
Ответов - 11
[только новые]
|
|
|
Отправлено: 05.01.22 13:42. Заголовок: Ygrek пишет: Подска..
Ygrek пишет: цитата: | Подскажите, чего я не вижу в диапазоне???? |
| Нижней границы)) Поднимите ее
|
|
|
|
Отправлено: 05.01.22 15:34. Заголовок: Винникова пишет: Ни..
Винникова пишет: цитата: | Нижней границы)) Поднимите ее |
| Все равно не эффективно( Как ускорить?
|
|
|
|
Отправлено: 05.01.22 16:35. Заголовок: Ygrek пишет: Как ус..
Ygrek пишет: Рассчитать х и сдвигая границы определить диапазон. Раньше, до КЕГЭ, так и делали, а в нынешних условиях задача стала очень простой, не требуется проводить анализ программы, вот и придумали изменить так, чтобы все-таки нужно было проанализировать, иначе по времени не проходит.
|
|
|
|
Отправлено: 06.01.22 12:52. Заголовок: Винникова пишет: Ра..
Винникова пишет: цитата: | Рассчитать х и сдвигая границы определить диапазон. |
| Спасибо 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)
|
|
|
|
Отправлено: 09.01.22 20:29. Заголовок: Винникова, подскажит..
Винникова, подскажите, пожалуйста как вы нашли диапозон в этом задании.
|
|
|
|
Отправлено: 09.01.22 21:13. Заголовок: 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 От этого числа двигаем границы в обе стороны, пока получаем результат.
|
|
|
|
Отправлено: 10.01.22 04:47. Заголовок: Огромное, спасибо...
Огромное, спасибо.
|
|
|
|
Отправлено: 11.01.22 13:41. Заголовок: Как вариант
Понимать алгоритм необходимо, но можно ограничиться приблизительным расчетом верхней границы, например, так: 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)
|
|
|
|
Отправлено: 17.01.22 14:56. Заголовок: Спасибо, за решение,..
Спасибо, за решение, мне кажется оно наиболее простое и понятное. В данном решении я бы поставила в условии if n//1000 < 228: условие if n//1000 < 230: т.к. 500+800=1300, а 1300 // 1000 = 1, т.е. шаг на 1, иногда на 2, поэтому меньше 230, а не меньше 231 кажется, что так логичнее объяснить что это за условие.
|
|
|
|
Отправлено: 26.01.22 16:58. Заголовок: Уважаемые коллеги! О..
Уважаемые коллеги! Осмелюсь предложить такое решение, самая большая проблема – не могу его обосновать. Буду благодарен если вы его подтвердите или опровергнете. Вводим следующие обозначения: 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
|
|
|
|
| Администратор
|
Сообщение: 3241
|
|
Отправлено: 27.01.22 12:19. Заголовок: konyashkind пишет: X..
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.
|
|
|
|