Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.07.11;
Скачать: CL | DM;

Вниз

Не пятница, но тем не менее...   Найти похожие ветки 

 
vecna ©   (2004-06-23 16:26) [0]

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

Надо найти в массиве размерностью N элеметов подмассив (непрерывный участок массива) с максимальной суммой. Количество элементов подмассива заранее неизвестно. Решение должно быть линейным (т.е. за один проход).

те кто уже знает, просьба не кидать ответ сразу. =)
предпологается, что есть 15-20 минут.


 
Sandman25 ©   (2004-06-23 16:28) [1]

Решением будет весь исходный массив... или я что-то не понимаю


 
vecna ©   (2004-06-23 16:30) [2]

нет естественно

[10, -10, 8, 3, -10]

ответ [8, 3]


 
Nikolay M. ©   (2004-06-23 16:31) [3]

Может, есть массив некоей размерности и в нем нужно найти N элементов подряд? А то задача особого смысла не имеет, имхо.


 
вразлет ©   (2004-06-23 16:32) [4]

vecna ©  

А что за форум?))


 
vecna ©   (2004-06-23 16:32) [5]

еще один пример:

[-10, -3, -2, -9]

ответ [-2]


 
Ega23 ©   (2004-06-23 16:32) [6]

Фигня какая-то...


 
Ega23 ©   (2004-06-23 16:33) [7]

ИМХО, такие задачки надо не на приёме на работу задавать, а на экзамене по информатике на первом курсе.


 
Nikolay M. ©   (2004-06-23 16:34) [8]


> vecna ©   (23.06.04 16:30) [2]

Ах, вот так вот... Интересно :)


 
panov ©   (2004-06-23 16:34) [9]

хм... вродк бы и решать-то нечего...


 
vecna ©   (2004-06-23 16:34) [10]

вразлет,
потом скажу =), если сами не найдете

Nikolay M,
посмотрите на примеры... элементы подряд, но N не известно (читайте внимательно условие)


 
panov ©   (2004-06-23 16:35) [11]

Сейчас для интереса засеку время, сколько понадобится для полной реализации алгоритма-)


 
vecna ©   (2004-06-23 16:37) [12]

Ega23 ©   (23.06.04 16:32) [6]
Фигня какая-то...

полностью согласен, но все же...


 
Prosvet ©   (2004-06-23 16:38) [13]

>[10, -10, 8, 3, -10]

>ответ [8, 3]

А почему не [10, -10, 8, 3]. Сумма ведь та же.


 
вразлет ©   (2004-06-23 16:39) [14]

и тут час нет Панова, два часа нет Панова, три часа нет Панова...


 
Layner ©   (2004-06-23 16:40) [15]

На SQL.RU и искал бы ответа, там эта тема несколько страниц занимала.


 
Romkin ©   (2004-06-23 16:41) [16]

vecna ©  (23.06.04 16:32) [5] Неверно, в оригинале 0 - сумма только положительная.
"Жемчужины программирования" - это оттуда. И в ответе должна быть только сумма. Никто не спрашивает границы элементов ;)
Иначе О(n) фиг получится ;)


 
vecna ©   (2004-06-23 16:41) [17]

Prosvet © согласен... плохой пример,
но идея ясна =)


 
YurikGL ©   (2004-06-23 16:42) [18]


> vecna ©   (23.06.04 16:26)  

Минут семь алгоритм придумывал.


 
YurikGL ©   (2004-06-23 16:43) [19]


> Romkin ©   (23.06.04 16:41) [16]

Кто мешает в конце делать проверку, если <0 то сумма=0


 
vecna ©   (2004-06-23 16:43) [20]

Romkin © как там написано, так и я написал.... имхо, найти сумму или гранцы, никак не влияет на сложность.


 
Romkin ©   (2004-06-23 16:43) [21]

Кстати, [-12, 34, -6, 5, 8, -45, 10] результат 41 должен быть ;)
(34 - 6 + 5 + 8)


 
Romkin ©   (2004-06-23 16:44) [22]

vecna ©  (23.06.04 16:43) [20] Еще как влияет!!!


 
vecna ©   (2004-06-23 16:44) [23]

"в оригинале 0 - сумма только положительная."

такого условия нет, задача сформулирована четко.


 
panov ©   (2004-06-23 16:45) [24]

Не, не дают на работе заняться.-(

Но алгоритм ведь простой...


 
Sandman25 ©   (2004-06-23 16:45) [25]

За 6 минут написал. Правильно?

function MaxSum(const A: array of Integer): Integer;
 function Max(A1, A2: Integer): Integer;
 begin
   if A1 > A2 then
     Result := A1
   else
     Result := A2
 end;
var
 I: word;
 CurrentSum: Integer;
begin
 Result := A[0];
 CurrentSum := Result;
 for I := 1 to High(A) do
 begin
   CurrentSum := Max(CurrentSum + A[I], A[I]);
   if CurrentSum > Result then
     Result := CurrentSum;
 end;
end;


 
Prosvet ©   (2004-06-23 16:46) [26]

>Prosvet © согласен... плохой пример,
>но идея ясна =)

В том то и дело, что не ясна. Эта последовательность должна содержать минимальное количество элементов или какое попало?


 
vecna ©   (2004-06-23 16:47) [27]

YurikGL ©
предлагайте алгоритм, код не нужен, я верю что все в состоянии =)

Romkin ©
нет, по крайней мере в моих решениях, две лишних переменных для хранения интервала только добавятся.


 
вразлет ©   (2004-06-23 16:47) [28]

Sandman25 ©  

Неправильно


 
Igorek ©   (2004-06-23 16:49) [29]

имхо нетривиальный алгоритм нужен; вроде было такое в "Жемчужинах программирования";


 
Sandman25 ©   (2004-06-23 16:50) [30]

[28] вразлет ©   (23.06.04 16:47)

Контрпример можно?


 
вразлет ©   (2004-06-23 16:50) [31]

panov ©

Что делать будем? Вон Панов уже сдался(


 
vecna ©   (2004-06-23 16:51) [32]

Prosvet ©
>В том то и дело, что не ясна. Эта последовательность должна >содержать минимальное количество элементов или какое попало?

максимальная сумма... интервал любой, если максимумов несолько

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


 
nikkie ©   (2004-06-23 16:51) [33]

перебираем i от 1 до N
храним 2 диапазона вида [a,b], где b<>i, и [c,i] с с максимальными суммами в своем классе.
по идее, легко написать пересчет этих интервалов при увеличении i на 1.


 
вразлет ©   (2004-06-23 16:52) [34]

Sandman25 ©  

Ты ищешь последовательность увеличивающихся символов


 
nikkie ©   (2004-06-23 16:54) [35]

> 2 диапазона вида [a,b], где b<>i, и [c,i] с с максимальными суммами в своем классе.
уточню: a<=b<i, c<=i.


 
vecna ©   (2004-06-23 16:55) [36]

понятно... =)))
пойду я покурю пока... уже 30 минут прошло...
еще 30 минут, и я опубликую ссылку где я это накопал


 
Sandman25 ©   (2004-06-23 16:56) [37]

[32] vecna ©   (23.06.04 16:51)

Математическая индукция. Сначала текущая сумма = первый элемент.
Следующая текущая сумма либо равна следующему элементу, либо текущей сумме + следующий элемент...
М-да, кодом понятнее ИМХО. Все примеры из этой ветки дали правильный результат.
Для получения массива надо еще накапливать используемые элементы - как реализовать ясно - добавляются аргументы к Max, но неохота возиться :)


 
Sandman25 ©   (2004-06-23 16:59) [38]

[34] вразлет ©   (23.06.04 16:52)

Нет. Пример массива приведите, пожалуйста


 
Fredericco ©   (2004-06-23 17:01) [39]

2 Sandman25 ©   (23.06.04 16:56) [37]
Согласен с вразлет ©   (23.06.04 16:52) [34] ,
ты прибавляешь любой элемент который больше суммых таких же предыдущих.


 
Sandman25 ©   (2004-06-23 17:03) [40]

[39] Fredericco ©   (23.06.04 17:01)

см. [38] :)



Страницы: 1 2 3 вся ветка

Текущий архив: 2004.07.11;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.038 c
3-1087283159
denis24
2004-06-15 11:05
2004.07.11
Как проверить существование таблицы на сервере БД


1-1087996349
Heretic
2004-06-23 17:12
2004.07.11
Подчиненные окна


8-1082813310
Nikkie48
2004-04-24 17:28
2004.07.11
Создание Exif подписи к jpg, чтение Exif, DCF


1-1087971013
Artem
2004-06-23 10:10
2004.07.11
Вопрос по TMenuItem


1-1088454767
Incognito
2004-06-29 00:32
2004.07.11
Как скомпилить программу