Всем привет, есть последовательность aaaa...aabbb...bbccc...cc..., причем a n штук, b

(n-1) штука, c (n-2) штуки и т.д. до 0.
Как по номеру элемента получить в каком сегменте (а, b, c и т д) он находится? Без цикла.

18 ответов

42 просмотра

Бинпоиск

Maus-Grau Автор вопроса
tiom4eg 🇷🇺
Бинпоиск

Не получится сегменты - абстрактны, а так это просто массив каких то чисел. Исправил вопрос)

tiom4eg 🇷🇺
Бинпоиск

Бинпоиск по ответу, я имел в виду. Если элемент находится левее, чем k последних сегментов, то его позиция <= n(n + 1)/2 - k(k + 1)/2

Maus-Grau Автор вопроса
tiom4eg 🇷🇺
Бинпоиск по ответу, я имел в виду. Если элемент на...

Аа, но это все равно цикл, я думал может формула есть какая...

Maus Grau
Аа, но это все равно цикл, я думал может формула е...

Ну можно попробовать поаппроксимировать и перебрать значения n - sqrt((n(n+1)/2 - x)/2) +- 3

k*(n + n - k) / 2 < i, найти наибольшее такое k

Albert
k*(n + n - k) / 2 < i, найти наибольшее такое k

Мне кажется, что все-таки (x+1)*(n + n - x) / 2 <= i+1

Maus-Grau Автор вопроса
Maus-Grau Автор вопроса
Vladimir Mokeev
Мне кажется, что все-таки (x+1)*(n + n - x) / 2 <=...

Это даже для 1 не работает, если взять n = 5, I = 1, то x должен быть -1)

Maus-Grau Автор вопроса
Vladimir Mokeev
А ноль?

При x=0, слева будет 5

Maus Grau
При x=0, слева будет 5

В другую сторону неравенство. x=0, как раз при n=5, i=0,1,2,3,4

Maus-Grau Автор вопроса
Vladimir Mokeev
В другую сторону неравенство. x=0, как раз при n=5...

Да, похоже сработало, генерируется верная последовательность, спасибо большое)

Если я правильно понял условие, то мы имеем треугольную матрицу вида aaaaaaaaaaa bbbbbbbbbb cccccccccc dddddddd ...... которая записана в одномерный массив. n - количество строк такой матрицы Размер такого массива - сумма первых n членов арифмет прогрессии с шагом 1. S = (n + 1) * n / 2 если нам надо найти некое число в сегменте под номером k, мы знаем, что все подходящие числа находятся в сегменте длины k, и перед ними сегмент k+1, а после k-1 (если k > 1 && k < n) Таким образом мы можем найти начало сегмента начиная с конца массива. Sk1 = k * (k - 1) / 2 соответственно конец Sk2 = Sk1 + k итого наше число находится в отрезке [n - Sk2, n - Sk1) Если нам известен индекс, то надо сделать обратную операцию: g = n - k -1 - находим индекс с конца. пользуясь тем, что мы знаем формулу начала сегмента получаем неравенство: (z+1) * z /2 <= g < (z+2) * (z+1) / 2 g мы знаем z - номер искомого отрезока Если поиграть с этим неравенством думаю можно вывести короткий алгоритм поиска, не привязанный к перебору размеров явно. Ну и поскольку z это номер "с конца" не забыть ревертнуть его в изначальный. (может где-то напутал со знаками, но вроде ок)

Maus-Grau Автор вопроса
Art Teatr
Если я правильно понял условие, то мы имеем треуго...

Да, так и есть, но пока у меня идея найти корни из предложенного выше уравнения и с помощью округления уже найти сам номер сегмента.

Maus Grau
Да, так и есть, но пока у меня идея найти корни из...

в моём случае у тебя 2 параболы (полу, только то что правее у) и прямая параллельная х надо найти точки пересечения и на получившемся отрезке должно лежать ровно одно целое значение (по х), которое и будет ответом.

Maus-Grau Автор вопроса
Art Teatr
в моём случае у тебя 2 параболы (полу, только то ч...

Спасибо, с корнем уже все получилось)

Похожие вопросы

Обсуждают сегодня

Всем привет Есть достаточно базовая задача: Дан неориентированный граф. Требуется определить, есть ли в нем цикл, и, если есть, вывести его. Входные данные подаются в виде ма...
Αλeksandr
10
Привет всем. Подскажите, как можно данную задачу более менее эффективно решить? В столовой одного известного Завода вот-вот начнётся обед. На обеде есть три гарнира — макарош...
Vitaliy
6
всем привет. У меня есть неупорядоченный массив точек(в моем случае в трёхмерном пространстве). Есть критерий связанности точек: если евклидово расстояние между ними меньше за...
Павлик Ливаткин
31
Доброе утро. Такой вопрос: есть ли какие-то практически полезные меры вычислительной мощности (в смысле computational complexity) для реальных машин, с ограниченными ресурсам...
Yaroslav Schekin
15
Всем привет Пытаюсь решить следующую задачу: https://informatics.msk.ru/mod/statements/view.php?id=6992&chapterid=101#1 Строка S была записана много раз подряд, после чего из ...
Αλeksandr
10
Здравствуйте. Есть задача нужно найти наименшое число P где фактриал P делиться на 10^N. Ограничения 10^9. Знаю что нужно найти такой P в конце как минимум N нулей. Решение с ...
. Azmiddin
20
Друзья, практический вопрос надо счиать скользящую медиану в последовательности по заданному окну (длины N) тупой вариант - взять значения в окне, отсортировать, взять элеме...
Стас Выщепан
17
Должна-ли работать такая стратегия: Мы каждую секунду бросаем монетку - орел или решка. Если орел - покупаем акцию на все деньги, если у нас есть деньги, или продаем все акци...
George Polevoy
13
#pragma once #include <iostream> #include <vector> template <typename T, typename Comp = std::less<T>> class Heap { public: Heap() = default; Heap(const std::vector<T>&...
Степан
1
Как можно сжимать временные ряды в памяти? У меня есть исторические стоимости ценных бумаг. Данные для каждой минуты в истории OHLC (Open, High, Low, Close). Соответственно, O...
George Polevoy
10
Карта сайта