Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/165: Рейтинг темы: голосов - 165, средняя оценка - 4.59
Заблокирован

Задача "Торговля акциями"

04.07.2020, 07:54. Показов 35620. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Её условие звучит так:
В настоящее время на бирже при торговле акциями активно применяются компьютерные системы, которые упрощают и автоматизируют процесс покупки и продажи акций. Некоторые из них даже позволяют вести торговлю вообще без участия человека.
Разумеется, основным критерием, по которому такие системы оцениваются, является прибыль, которую приносит торговля с их применением. Для того, чтобы ее повысить при построении этих систем применяются различные математические методы и модели, такие, как, например, квадратичное программирование, нейронные сети, генетические алгоритмы и т. д.
Основной трудностью при создании таких систем является то, что они должны некоторым образом учитывать изменение стоимости акций в будущем, а также его прогнозировать. Ваша задача несколько проще — курсы продажи и покупки акций за весь период из n дней уже известны, необходимо лишь разработать оптимальную стратегию продаж и покупок. При этом для простоты будем считать, что за эти n дней купить акции можно не более одного раза и продать акции можно также не более одного раза.
Кроме этого, будем считать, что продажа и покупка будет осуществляться только с акциями одного типа. На начало этого периода вы располагаете суммой в x рублей. Для каждого из дней известна цена ai (от ask — цена предложения), по которой можно купить одну акцию, и цена bi (от bid — цена спроса), по которой можно одну акцию продать. При этом в соответствии с действующими правилами торгов на бирже разрешается продавать и покупать только целое число акций (например, если у вас есть 5 рублей, а акция стоит 2 рубля, то вы можете купить не более двух акций).
Требуется написать программу, которая по имеющимся данным о стоимости акций в каждый из дней, найдет оптимальную стратегию покупки и продажи акций.
Входные данные
Первая строка входного файла содержит два целых числа n и x (1 ≤ n ≤ 100000, 1 ≤ x ≤ 106).
Вторая строка входного файла содержит n целых чисел a1, . . . , aт. Третья строка входного файла содержит n целых чисел b1, . . . , bт. Для каждого индекса i (1 ≤ i ≤ n) выполняются неравенства 1 ≤ bi ≤ ai ≤ 1000.
Выходные данные
В первой строке выходного файла выведите максимальную сумму, которой вы можете обладать по окончании рассматриваемого периода. Во второй строке выведите два числа — номер дня d1, в который следует купить акции, и номер дня d2, в который эти акции следует продать (должно выполняться неравенство d2 > d1). При этом подразумевается, что покупается столько акций, сколько их можно купить на x рублей, а потом они все продаются. Если в найденной вами стратегии продавать и покупать акции не требуется, то выведите выведите во второй строке «-1 -1».
Если существует несколько вариантов оптимальной стратегии, то выведите любой из них
Примеры
Входные данные
5 1000
2 3 1 4 3
1 2 1 2 3
Выходные данные
3000
3 5
Входные данные
5 1000
10 9 8 7 6
9 8 7 6 5
Выходные данные
1000
-1 -1


Я уже испробовал кучу разных решений, но большинство из них не проходит и выдаёт неправильный ответ, но я не понимаю, где я ошибся. Вот решение, которое прошло 15% тестов (у меня наилучший результат):
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n, x = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
minimum, i_minimum = a[0], 0
a0, b0 = -2, -2
ans = x
for i in range(1, n):
   if x // minimum * b[i] > ans:
      ans = x // minimum * b[i]
      a0 = i_minimum
      b0 = i
   if a[i] < minimum:
      minimum = a[i]
      i_minimum = i
print(ans)
print(a0 + 1, b0 + 1)
Подскажите, пожалуйста, где моя ошибка!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2020, 07:54
Ответы с готовыми решениями:

Торговля акциями
В настоящее время на бирже при торговле акциями активно применяются компьютерные системы, которые упрощают и автоматизируют процесс покупки...

Торговля акциями
Торговля акциями В настоящее время на бирже при торговле акциями активно применяются компьютерные системы, которые упрощают и...

Ребята, где у меня ошибка Торговля акциями
n,x = input().split() n = int(n) x = int(x) f = 1 a = b = ibest = 0 jbest = 1 imin = 0

11
3 / 3 / 0
Регистрация: 15.06.2020
Сообщений: 44
04.07.2020, 13:22
Как вы узнаёте сколько процентов тестов ваше решение прошло?
0
 Аватар для palva
4278 / 2970 / 693
Регистрация: 08.06.2007
Сообщений: 9,930
Записей в блоге: 5
04.07.2020, 14:48
А вы можете объяснить свое решение?
0
3 / 3 / 0
Регистрация: 15.06.2020
Сообщений: 44
04.07.2020, 15:12
я тоже ещё не решил говорит, не верный ответ

Добавлено через 42 секунды
мне просто хочется понять сколько у меня не правильно тестов проходит

Добавлено через 1 минуту
А вот мой код если интересно:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
n, x = map(int, input().split())
 
a = list(map(int, input().split()))
b = list(map(int, input().split()))
 
top = x
top_buy = -1
top_sell = -1
min_a = 0
max_b = 0
max_diff = 0
 
for i in range(n):
    if a[i] <= x:
        if top_sell < i + 1:
            c = b[i:]
            max_b = max(c)
            top_sell_new = c.index(max_b) + i + 1
        if max_b - a[i] > max_diff:
            max_diff = max_b - a[i]
            min_a = a[i]
            top_buy = i + 1
            top_sell = top_sell_new
if min_a != 0:
    top = max_b * (x // min_a) + x % min_a
print(top)
print(top_buy, top_sell)
Добавлено через 1 минуту
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
n, x = map(int, input().split())
 
a = list(map(int, input().split()))
b = list(map(int, input().split()))
 
top = x
top_buy = -1
top_sell = -1
m = 0
 
for i in range(n):
    h = x // a[i]
    o = x % a[i]
    if top_sell < i + 1:
        c = b[i:]
        m = max(c)
        top_sell_new = c.index(m) + i + 1
    if m * h + o > top:
        top = m * h + o
        top_buy = i + 1
        top_sell = top_sell_new
print(top)
print(top_buy, top_sell)

А этот код работает правильно но медленно.
(Хотя я вроде всё что можно ускорил)

Добавлено через 27 секунд
???

Добавлено через 43 секунды
как узнать сколько тестов прошло?
0
2 / 2 / 0
Регистрация: 26.03.2019
Сообщений: 35
05.07.2020, 10:25
Fedor11, смотря на какой тестирующей программе.
Если это Сириус, то никак, да и вообще, чаще всего пишут кол-во пройденных и непройденных тестов, но сами тесты не пишут
1
3 / 3 / 0
Регистрация: 15.06.2020
Сообщений: 44
05.07.2020, 10:51
а на какой тест системе можно узнать кол-во пройденных тестов?
0
1 / 1 / 0
Регистрация: 03.06.2020
Сообщений: 13
06.07.2020, 13:07
На informatics
0
3 / 3 / 0
Регистрация: 15.06.2020
Сообщений: 44
07.07.2020, 16:12
Цитата Сообщение от TukTukL Посмотреть сообщение
На informatics
Спасибо!

Вы решение придумали?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
08.07.2020, 03:19
Цитата Сообщение от Fedor11 Посмотреть сообщение
c = b[i:]
        m = max(c)
        top_sell_new = c.index(m) + i + 1
этот кусок можно считать за O(1) если предварительно посчитать за O(n),
а у вас на каждом шаге считается за O(n) в итоге алгоритм получается O(n^2)

Добавлено через 37 минут
Переделал ваш код под O(n).

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
n, x = map(int, input().split())
 
a = list(map(int, input().split()))
b = list(map(int, input().split()))
 
d = [(n-1, b[n-1])]*n
mxi = n-1  # индекс макс c i
mx = b[n-1]  # макс c i
for i in range(n-2, -1, -1):
    if b[i] > mx:
        mxi = i
        mx = b[i]
    d[i] = (mxi, mx)
 
top = x
top_buy = -1
top_sell = -1
m = 0
 
for i in range(n):
    h = x // a[i]
    o = x % a[i]
    if top_sell < i + 1:
        top_sell_new = d[i][0] + 1
 
    m = d[i][1]
    if m * h + o > top:
        top = m * h + o
        top_buy = i + 1
        top_sell = top_sell_new
print(top)
print(top_buy, top_sell)
В задаче не разбирался, просто ускорил решение. Должно работать, если изначальное решение было верным.
2
Эксперт Python
 Аватар для dondublon
4653 / 2073 / 366
Регистрация: 17.03.2012
Сообщений: 10,183
Записей в блоге: 6
08.07.2020, 12:48
gurulTailan, Похоже на динамическое программирование, но 100% уверенности нет, надо вникать. Почитайте теорию.
0
3 / 3 / 0
Регистрация: 15.06.2020
Сообщений: 44
14.07.2020, 11:44
спасибо, ваш код правильно работает!


надо было только ускорить и всё!

Спасибо.
0
7 / 7 / 0
Регистрация: 29.01.2022
Сообщений: 55
19.03.2023, 22:11
Спустя 3 года

Вот мое решение:
Но есть странный костыль c n == 1
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
n, x = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
abest = 0
bbest = 1
amin = 0
if n != 1:
    for bj in range(2, n):
        if x // a[bj - 1] > x // a[amin]:
            amin = bj - 1
    
        if x // a[amin] * b[bj] + x % a[amin] > x // a[abest] * b[bbest] + x % a[
                abest]:
            abest = amin
            bbest = bj
 
if n != 1 and x // a[abest] * b[bbest] + x % a[abest] > x:
    print(x // a[abest] * b[bbest] + x % a[abest])
    print(abest + 1, bbest + 1)
else:
    print(x)
    print(-1, -1)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2023, 22:11
Помогаю со студенческими работами здесь

Торговля акциями
Условие В настоящее время на бирже при торговле акциями активно применяются компьютерные системы, которые упрощают и автоматизируют...

Задача оптимизации. Торговля орехами и сушеными фруктами.
Добрый вечер! Собственно вопрос по задаче для меня не из легких.Начало есть,а завершение не поддается. Магазин, расположенный на окраине...

А вы забираете свои дивиденды ?? Управление акциями
Здравствуйте. Хочу узнать как и кто распорядился своим приватизационным ваучером. Как вы распоряжаетесь акциями ?? Начисляют ли...

[py3] Робот для автоматической торговли акциями
Напишите робота для автоматической торговли акциями на бирже. Вводится цена акций в первый, второй и т. д. дни, ноль — сигнал...

Напишите робота для автоматической торговли акциями на бирже
Напишите робота для автоматической торговли акциями на бирже. Вводится цена акций в первый, второй и т. д. дни, ноль — сигнал...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
Функция установки текстового статуса в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru