Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.037 c
3-1087192084
Tariel
2004-06-14 09:48
2004.07.11
InterBase - Сколько раз выполняется вложенный запрос в where


3-1087045844
Karlson
2004-06-12 17:10
2004.07.11
Фильтрация в union all


3-1086879429
Subdigger
2004-06-10 18:57
2004.07.11
dbms_output


1-1087973954
Aldor
2004-06-23 10:59
2004.07.11
%d в FormatStrings поддерживает Int64?


1-1088005401
Ivolg
2004-06-23 19:43
2004.07.11
Снимок





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский