1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
|
|||||||||||
1 | |||||||||||
Олимпиадная задача с тимуса №120901.07.2014, 11:29. Показов 2045. Ответов 13
Метки нет Все метки)
(
Ограничение времени: 1.0 секунды
Ограничение памяти: 64 МБ Представим себе бесконечную последовательность цифр, составленную из записанных друг за другом возрастающих степеней десятки. Вот начало этой последовательности: 110100100010000… Всё, что надо — определить, какая цифра находится в такой последовательности на определённом месте. Исходные данные В первой строке находится целое число N (1 ≤ N ≤ 65535). В i-й из N последующих строк записано целое число Ki — номер позиции в последовательности (1 ≤ Ki ≤ 2^31 − 1). Результат Выведите через пробел N цифр. i-я цифра должна равняться цифре, которая находится в описанной выше последовательности на позиции с номером Ki. Пример исходные данные 4 3 14 7 6 результат 0 0 1 0 Мое решение:
Добавлено через 1 минуту Затупила тут - очевидно, что должно быть tek - j > 0 Добавлено через 1 минуту Но теперь почему-то Time limit exceeded Добавлено через 7 минут
0
|
|
01.07.2014, 11:29 | |
Ответы с готовыми решениями:
13
задача с Тимуса задача с Тимуса Задача с тимуса |
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
|
|
01.07.2014, 13:35 | 2 |
Керра, лучше сначала заполнить массив, а потом производить поиск.
Так думаю будет быстрее.
0
|
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
|
|
01.07.2014, 13:56 [ТС] | 3 |
GuGo1991, для входных данных я вообще массив не использую. А как дополнительные действия могут ускорить программу?
И вообще проблема во вложенном цикле. Известно, что есть какая-то формула, которая сразу что-то вычисляет, без цикла. Но эту формулу я не могу ни найти, ни придумать.
0
|
01.07.2014, 13:59 | 4 |
Я предлагаю решение вообще в другом ключе: вычисляйте позиции 1 и 0. Так как с каждым увеличением разряда прибавляется только один 0.
Код
int GetDigit(const int pos) { int delta = 0; int start = 1; // позиция 1 int end = 1; // конец числа while pos not in [start..end] { delta++; start = end + 1; end = start + delta; } if pos == start return 1; else return 0; }
1
|
272 / 266 / 146
Регистрация: 02.08.2012
Сообщений: 609
|
||||||
01.07.2014, 14:32 | 5 | |||||
Керра, формула кажется эта k(k + 1) / 2 + k + 2, поиск точного квадрата.
Должно работать:
0
|
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
|
|
01.07.2014, 15:24 [ТС] | 7 |
IrineK, вот откуда эта формула, и почему там какое-то 8, по какой логике это работает?
0
|
Заблокирован
|
|
01.07.2014, 15:48 | 8 |
![]() Решение
Керра,
Работает? Добавлено через 14 минут Рассмотрим строку 11010010001000 и т.д. пока будем нумеровать с 0 Единицы стоят на позициях 0 = 0 0+1= 1 0+1+2 = 3 0+1+2+3 = 6 0+1+...+n = n(n+1) / 2 Пусть k - позиция единицы, т.е. n(n+1) / 2 = k Найдем соответствующее n, решив квадратное уравнение n^2 + n - 2k = 0 D = 1 + 8k (вот и 8) Поскольку n>=0 Теперь внесем поправку на нумерацию k не от 0, а с 1
3
|
zzzZZZ...
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
|
||||||
01.07.2014, 15:58 | 9 | |||||
Не по теме: я вообще в шоке с таких заданий, особенно после 3 часов сна, откуда вы эти формулы берёте... быдлокод и вроде работает
![]() ![]()
0
|
1296 / 469 / 151
Регистрация: 24.08.2011
Сообщений: 2,249
|
|
01.07.2014, 19:17 [ТС] | 10 |
IrineK, благодарю
0
|
Заблокирован
|
|
01.07.2014, 19:39 | 14 |
Ну дай бог мне и дальше угадывать.
0
|
01.07.2014, 19:39 | |
Помогаю со студенческими работами здесь
14
Задача с Тимуса 1446
Задача с тимуса про сороконожку
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |