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

За один проход в массиве найдите непрерывный кусок, сумма чисел в котором максимальна

17.07.2019, 10:44. Показов 37761. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В одномерном массиве, заполненном произвольными целыми числами, за один проход найдите непрерывный кусок, сумма чисел в котором максимальна.

Примечание. Фактически требуется найти такие i и j (ij), что сумма всех элементов массива от ai до aj включительно будет максимальна.
На вход программе сначала подается натуральное n<=100000 — количество элементов в массиве. Далее, по одному в строке расположены сами элементы массива — целые числа, по модулю не превосходящие 30 000.
Выдайте пару искомых значений индексов. Если таких пар несколько, то j должно быть минимально возможным, а при равных j значение i должно быть максимально возможным.
Есть код который не заходит 2 теста, например
7
2
-2
3
-1
5
-2
7
Сам код:
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
n = int(input())
a = []
for i in range(n):
    a.append(int(input()))
if n == 2:
    print(1)
    print(2)
    exit(0)
ans = a[0]
ans_l = 0
ans_r = 0
s = 0
minus_pos = -1;
for r in range(n):
    s += a[r];
    if (s > ans):
        ans = s
        ans_l = minus_pos + 1
        ans_r = r
    if (s < 0):
        s = 0
        minus_pos = r
print(ans_l+1)
print(ans_r+1)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.07.2019, 10:44
Ответы с готовыми решениями:

За один проход найти непрерывный кусок массива, сумма чисел в котором максимальна (Python -> C++)
Вот код на языке python. Если этого не достаточно, то вот условие задачи: Сумма чисел в массиве В одномерном массиве, заполненном...

Найти непрерывный фрагмент массива сумма чисел в котором максимальна
В одномерном массиве, заполненном произвольными целыми числами, за один проход найдите непрерывный кусок, сумма чисел в котором...

Найти непрерывный фрагмент массива сумма чисел в котором максимальна
Сумма чисел в массиве В одномерном массиве, заполненном произвольными целыми числами, за один проход найдите непрерывный кусок, сумма...

6
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
17.07.2019, 15:20
Держи:

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
# -*- coding: utf-8 -*-
 
 
class Result:
 
    def __init__(self, total, start, end):
        self.total = total
        self.start = start
        self.end = end
 
    def __lt__(self, other):
        if self.total == other.total:
            if self.end == other.end:
                return self.start > other.start
            else:
                return self.end < other.end
        else:
            return self.total > other.total
 
 
n = 8
a = [7, 2, -2, 3, -1, 5, -2, 7]
_a = []
 
for i in range(n):
    for j in range(i, n):
        _a.append(Result(sum(a[i: j]), i, j))
 
_a.sort()
 
for obj in _a:
    print(obj.total, obj.start, obj.end)
1
4 / 3 / 1
Регистрация: 17.07.2019
Сообщений: 2
17.07.2019, 18:16
Лучший ответ Сообщение было отмечено Антон Ф как решение

Решение

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
n = int(input())
a = []
for i in range(n):
    a.append(int(input()))
if n == 2:
    print(1)
    print(2)
    exit(0)
ans = a[0]
ans_l = 0
ans_r = 0
s = 0
minus_pos = -1;
for r in range(n):
    s += a[r];
    if (s > ans):
        ans = s
        ans_l = minus_pos + 1
        ans_r = r
    if (s <= 0): #Вот здесь!
        s = 0
        minus_pos = r
print(ans_l+1)
print(ans_r+1)


P.S. Равно забыл поставить!!)))
3
29 / 27 / 2
Регистрация: 17.07.2019
Сообщений: 38
18.07.2019, 08:30  [ТС]
Спасибо, действительно забыл =
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
18.07.2019, 16:25
DmFat, Ваше решение эффектно, но с ошибкой. Поэтому выдает не верный результат.
Если уж делать с классом, то я бы сделал так:
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
class Segment:
    def __init__(self, arr, leftI, rightI):
        self.arr = arr
        self.leftI = leftI
        self.rightI = rightI
    def sumS(self):
        s = sum(self.arr[self.leftI:self.rightI+1])
        return s
    def __lt__(self, other):
        if self.sumS() == other.sumS():
            if self.rightI == other.rightI:
                return self.leftI < other.leftI
            else:
                return self.rightI > other.rightI
        else:
            return self.sumS() < other.sumS()
 
if __name__ == '__main__':
    n = 8
    a = [7, 2, -2, 3, -1, 5, -2, 7]
    _a = []
    for i in range(n):
        for j in range(i, n):
            _a.append(Segment(a, i, j))
    _a.sort()
    result = _a[-1]
    print(result.leftI, result.rightI, result.sumS())
    #print('*'*10)
    #for obj in _a:
    #    print(obj.leftI, obj.rightI, obj.sumS())
У меня структура отличается от Вашей, и как я считаю более соответствует духу ООП.
Но Ваш вариант тоже будет правильно работать, если исправить строку 27 на
Python
1
_a.append(Result(sum(a[i:j+1]), i, j))
0
0 / 0 / 0
Регистрация: 31.01.2019
Сообщений: 2
28.07.2019, 14:55
Судя по входным данным, числа не обязательно должны быть положительными. Мне интересно, как код из первого сообщения будет работать, если ВСЕ числа отрицательные, например:
5 #дано 5 отрицательных чисел
-100
-200
-300
-10
-5

Не работает же...
И исправленный вариант с <= тоже не работает.

Добавлено через 28 минут
а, там по условию задачи i может равняться j. то есть непрерывный кусок может из 1 числа состоять.
тогда работает, сорри.
0
0 / 0 / 0
Регистрация: 10.08.2022
Сообщений: 1
10.08.2022, 18:30
Мой код, конечно, нечитабельный кошмар, но я не могу понять, почему он проходит лишь часть тестов
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
n = int(input())
if n == 2:
    print(1)
    print(2)
    exit(0)
p = [0] * (n + 1)
ibest = 0
jbest = 0
c = 0
imin = 0
for i in range(1, n + 1):
    a = int(input())
    p[i] = p[i - 1] + a
    if p[i] <= 0:
        imin = i
for j in range(1, n + 1):
    if p[j] < p[imin]:
        imin =  j
    if p[j] - p[imin] > p[jbest] - p[ibest]:
        jbest = j
        ibest = imin
for i in range(len(p)):
    if p[i] <= 0:
        c = c+1
if c == len(p):
    ibest = p.index(max(p[1:]))-1
    jbest = p.index(max(p[1:]))
if ibest < jbest:    
    print(ibest+1, jbest)
else:
    print(ibest, jbest)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.08.2022, 18:30
Помогаю со студенческими работами здесь

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

Найдите столбец из массива, в котором сумма чисел будет максимальна
Дан файл &quot;file.txt&quot; , где в каждой строке находится числа , разделенные пробелом. Гарантируется ,что в каждой строке будет одинаковое...

Найти непрерывный участок массива, в котором сумма положительных элементов максимальна
Решите подобную задачу: Создать массив целых чисел и заполнить его случайными значениями. Размер массива 100 и диапозон значений...

Найти в массиве непрерывный участок из 10 элементов, сумма которых максимальна
Помогите пожалуйста, нужно объявить массив целых чисел и заполнить его случайными значениями (диапазон значений: ). Найти непрерывный...

Дан массив из случайных целых чисел. Найдите три последовательных элемента в массиве, сумма которых максимальна
Дан массив из случайных целых чисел. Найдите три последовательных элемента в массиве, сумма которых максимальна. И добавьте это число в...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru