Задачка по программированию

vera_79

Народ, помогите решить следующую задачу:
Дано положительное целое число К и К целых чисел А(1...,А(К). Вычислить наиболее близкое к заданному числу Р возможное значение суммы
S(М,N)=А(М)+А(М+1)+...+А(N-1)+А(N
где 1<=М<=N<=К.
Примечание. Число К столь велико, что числа А(1А(2 ..., А(К) занимают примерно одну пятую памяти, отводимой для хранения данных, а на выполнение К2 даже простейших операций не хватает времени.

aport

Вычислить наиболее близкое к заданному числу Р возможное значение суммы
вот это я не понял....
есть ряд чисел
есть границы внутри ряда.
Нужно оценить сумму чисел внутри этих границ
Что такое Р и нах нужно? Что значит "сумма наиболее близкая к заданному числу Р?
Р - это искомая сумма что ли?

Serab

[math]$$\min_{m,n} \left| P - \sum_{j=m}^{n} a_j \right|$$[/math]

Serab

отрицательный числа, я так понимаю, есть?

Serab

Это задача практическая или нужен самый эффективный алгоритм поиска точного решения?

Serab

ну да, если неотрицательные, то можно за k log k: считаем суммы от 1 до j, идем по этому массиву, в хвосте ищем двоичным поиском место для s_j + P, вычисляем разницу, находим минимум. Если есть отрицательные — пока хз.

vera_79

Да, это решение я тоже нашел. Только в нем есть ошибка, во фразе "Нам надо найти в этом массиве два элемента C[i] и C[j], значение разности которых наиболее близко к P". Нужно, чтобы в неотсортированном массиве было i < j, иначе C[j] - C[i] не будет A[i + 1] + ... + A[j]. Алгоритм же тупо сортирует C и ищет минимум по любым i, j.
Например, пусть A = [10, -3].
Тогда C = [0, 10, 7].
Отсортированный С = [0, 7, 10].
Пусть P = 3. Алгоритм в решении с радостью найдет C[3] - C[2] = 3, и, соответственно, выдаст ответ 0.
При этом правильный ответ будет 4.

vera_79

Отрицательные могут быть. Задача олимпиадная, идеальная эффективность не нужна, нужно только, чтобы требования в условии выполнялись.

Serab

Задача олимпиадная, идеальная эффективность не нужна
тут либо противоречие, либо необходимо явное ограничение на k и требуемое время работы. Короче, нужен наиболее эффективный алгоритм.

Vlad1953

Да, это решение я тоже нашел. Только в нем есть ошибка
Извините, поспешил. Не сообразил сразу, что A могут быть отрицательными.

vera_79

Не, почему противоречие. Просто сказано, что сложность не должна быть O(n^2). Можно хоть O(n^1.999). Ну или O(n logn).

yolki

а это разве не NP?
вот выбрать подмножество, дающую максимальную сумму - точно NP.
а вот непрерывный отрезок... надо прикинуть

Serab

конечно не NP, можно все эти отрезки перебрать за K^2 :grin:

Serab

А можно даже в лоб за K^3 (не подсчитывая аккумулированную сумму).

Serab

конечно не NP
хотя если принимать во внимание нерешенность задачи NP=P, это заявление выглядит довольно смело :grin:

tokuchu

Например, пусть A = [10, -3].
Тогда C = [0, 10, 7].
Отсортированный С = [0, 7, 10].
Пусть P = 3. Алгоритм в решении с радостью найдет C[3] - C[2] = 3, и, соответственно, выдаст ответ 0.
При этом правильный ответ будет 4.
Это как будет 4? Там вроде сумма 4 никак не получается в этом массиве.

Serab

разность суммы 10 и -3 и числа 3, я тоже не сразу понял, что за 4 :grin:

mbolik1

Да, это решение я тоже нашел. Только в нем есть ошибка, во фразе "Нам надо найти в этом массиве два элемента C[i] и C[j], значение разности которых наиболее близко к P". Нужно, чтобы в неотсортированном массиве было i < j, иначе C[j] - C[i] не будет A[i + 1] + ... + A[j]. Алгоритм же тупо сортирует C и ищет минимум по любым i, j.
Что мешает при поиске минимума откидывать варианты когда j>=i?

salamander

На правах зануды.
Конечно же она NP, что ты в своем посте и доказал:
можно все эти отрезки перебрать за K^2 :grin:

Maurog

вы точно знаете, что такое NP? попробуйте доказать более качественно

Serab

ну позразумевалась NP-полная в исходном посте, очевидно, мы тут не теорией занимаемся, нам лишние слова писать некогда :)
Оставить комментарий
Имя или ник:
Комментарий: