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

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

17.07.2019, 10:44. Показов 38341. Ответов 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
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru