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

Вниз

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

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

[39] Fredericco ©   (23.06.04 17:01)

см. [38] :)


 
вразлет ©   (2004-06-23 17:04) [41]

Sandman25 ©

1 2 1


 
Sandman25 ©   (2004-06-23 17:05) [42]

[41] вразлет ©   (23.06.04 17:04)

4


 
вразлет ©   (2004-06-23 17:08) [43]

1 2 1 -1 -1 3


 
Fredericco ©   (2004-06-23 17:09) [44]

1 -2 2 1
Если правильно понял условие то должно быть 3 [..,..,2,1]
А у тебя получиться 4 [1,..,2,1].
Вроде как ряд суммы должен быть непрерывным...


 
blackman ©   (2004-06-23 17:10) [45]

Но что же тогда они предлагают решить перед увольнением ?


 
Sandman25 ©   (2004-06-23 17:11) [46]

[43] вразлет ©   (23.06.04 17:08)

5


 
Romkin ©   (2004-06-23 17:11) [47]

Тесты, плиз:
[5, -12, 4, -2, 4, -3] = 6
[15, -12, 34, -27, 12, -23] = 37
[15, -12, 34, -27, 28, -23] = 38


 
Sandman25 ©   (2004-06-23 17:11) [48]

[44] Fredericco ©   (23.06.04 17:09)

3


 
panov ©   (2004-06-23 17:12) [49]

>Fredericco ©   (23.06.04 17:09) [44]

Как ни странно, но код Sandman25 работает правильно-)


 
Sandman25 ©   (2004-06-23 17:13) [50]

[47] Romkin ©   (23.06.04 17:11)

6
37
38

В-общем, мой алгоритм правильный. Кто не согласен, может проверить в Delphi самостоятельно. я устал :)


 
вразлет ©   (2004-06-23 17:15) [51]

Sandman25 ©

Та находишь сумму, а не сам подмассив


 
Рыба ©   (2004-06-23 17:17) [52]

15 минут.

function GetMaxPath(const A: array of Integer): TPoint;
var i, MaxS, S: Integer;
   MaxSP, P: TPoint;
   Sbros: Boolean;
begin
 S := A[0];
 P := Point(0, 0);
 MaxS := S;
 MaxSP := P;
 Sbros := False;
 for i := 1 to High(A) do begin
   if A[i] < 0 then begin
     if MaxS < S then begin
       MaxS := S;
       MaxSP := P;
     end;
     if MaxS < A[i] then begin
       MaxS := A[i];
       MaxSP := Point(i, i);
     end;
     Sbros := True;
   end
   else begin
     if Sbros then begin
       P := Point(i, i);
       S := A[i];
       Sbros := False;
     end
     else begin
       Inc(S, A[i]);
       Inc(P.y);
     end;
   end;
 end;
 if MaxS < S then Result := P
             else Result := MaxSP;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 Randomize;
end;

procedure TForm1.Button1Click(Sender: TObject);
const Length = 10;
var i: Integer;
begin
 ListBox1.Clear;
 SetLength(FMass, Length);
 for i := 0 to Length - 1 do begin
   FMass[i] := Random(20) - Random(15);
   ListBox1.Items.Add(IntToStr(FMass[i]));
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var P: TPoint;
   i: Integer;
begin
 ListBox2.Clear;
 P := GetMaxPath(FMass);
 for i := P.x to P.y do
   ListBox2.Items.Add(IntToStr(FMass[i]));
end;


 
YurikGL ©   (2004-06-23 17:17) [53]

Реализовал, вроде работает правильно.
Суть в том, что формируется матрица NxN сумм, т.е. в элементе матрицы [2,5] содержится сумма элементов от 2-го до 5-го. Матрица формируется в один проход. Потом просто ищется максимум.

Реализовал с треугольной матрицей.


 
Romkin ©   (2004-06-23 17:18) [54]

Sandman25 ©  (23.06.04 17:13) [50] Код правильный :)))


 
Sandman25 ©   (2004-06-23 17:20) [55]

[51] вразлет ©   (23.06.04 17:15)

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

Еще 3 минуты работы :)


 
panov ©   (2004-06-23 17:23) [56]

>вразлет ©   (23.06.04 17:15) [51]

Алгоритм от Sandman25 тривиально изменяется для возврата границ получаемого подмассива:

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

procedure TForm1.Button3Click(Sender: TObject);
var
 b,e: Integer;
begin
 ShowMessage(IntToStr(MaxSum( [15, -12, 34, -27, 28, -23],b,e))+":("+IntToStr(b)+","+IntToStr(e)+")");
end;


 
вразлет ©   (2004-06-23 17:25) [57]

panov ©

Да знаю я, что уж и придраться нельзя?)


 
YurikGL ©   (2004-06-23 17:27) [58]

Понимаю, что оперировал с массивом размерностью 5, на всегда можно поменять на N
mas: array [1..5] of integer;
mas2:  array [1..5,1..5] of integer;
i,j,k,vr,n,m,j2,i2:integer;

mas[1]:=1;
mas[2]:=5;
mas[3]:=-1;
mas[4]:=3;
mas[5]:=0;
for i:=1 to 5 do
 for j:=1 to 5 do mas2[i,j]:=0;
for i:=1 to 5 do
 for j:=i to 5 do
   for k:=i downto 1 do
     mas2[j,k]:=mas2[j,k]+mas[i];
m:=0;
j2:=0;
i2:=0;
for i:=1 to 5 do
 for j:=1 to i do
   if m<mas2[i,j] then begin
     m:=mas2[i,j];
     j2:=j;
     i2:=i;
                       end;
ShowMessage("Промежуток ["+IntToStr(i2)+","+intToStr(j2)+"] сумма="+IntToStr(m));


 
vecna ©   (2004-06-23 17:28) [59]

вот:
http://www.sql.ru/forum/actualthread.aspx?bid=9&tid=93718&hl=%f2%e5%f1%f2%ee%e2%fb%e5+%e7%e0%e4%e0%f7%e8


 
vecna ©   (2004-06-23 17:35) [60]

panov ©
посмотрел ваш код, я придумал такой же... =)

Sandman25 ©
тоже посмотрел внимательно, соглашусь на то что правильно =))


 
panov ©   (2004-06-23 17:41) [61]

>vecna ©   (23.06.04 17:35) [60]
это не мой, это Sandman25(c) -)


 
Fredericco ©   (2004-06-23 17:42) [62]

2 Sandman25 ©  
Согласен. Был не прав.


 
default ©   (2004-06-23 18:09) [63]

такое не катит?
function SpecSum(Mas: Array of Integer): Integer;
var
i, j: Cardinal;
Sum: Integer;
begin
Result := Mas[0];
for i := 0 to High(Mas) do begin
 Sum := Mas[i];
 for j := i+1 to High(Mas) do begin
  Inc(Sum, Mas[j]);
  if Result < Sum then Result := Sum
 end;
end;
end;


 
Romkin ©   (2004-06-23 18:17) [64]

Такое не катит. Время О(n^2) :))


 
Рыба ©   (2004-06-23 18:17) [65]

А мой код неверен.


 
Romkin ©   (2004-06-23 18:53) [66]

А теперь финт ушами: Дан массив NxN целых чисел, найти в нем прямоугольную область с максимальной суммой. С наименьшей асимптотикой


 
default ©   (2004-06-23 18:55) [67]

Romkin ©   (23.06.04 18:53) [66]
повезло слонам


 
VEG ©   (2004-06-23 19:34) [68]

А я бы как всегда рекурсивно решал. Люблю я рекурсию, и все тут!;) У меня все рекурсивно решается...


 
VEG ©   (2004-06-23 19:37) [69]

Хотя, придумал самый извращенный метод. Думаю, гигабайт 200 будет весить (помните про функцию перевертывания строки объемом в 450Гб?). Будет время, напишу;)


 
VEG ©   (2004-06-23 19:40) [70]

Люди, а меня в школе учили, что линейный алгоритм не может в себе иметь никаких циклов for т.д., а вас?


 
default ©   (2004-06-23 20:03) [71]

если
a11 a12 a13
a21 a22 a23
a31 a32 a33

a11a13, a11a13a21a23 прямоуг-ики?


 
VEG ©   (2004-06-23 20:32) [72]

Изврат писал-писал, запутался... Вообщем, написал простой пример. Где-то минут 10 потратил... Правда, наверное, это не совсем линейный алгоритм.

function MaxSumPos(const iArr: array of integer): tpoint;
var
//  iMatrix: array of array of integer;
  i, j: integer;
  s, m: integer;
 begin
 m:=0;
// SetLength(iMatrix, high(iArr)+1);
 for i:=0 to high(iArr) do
   begin
   s:=0;
//   SetLength(iMatrix[i], high(iArr)+1);
   for j:=i to high(iArr) do
     begin
     inc(s, iArr[j]);
     if s>m then
       begin
       m:=s;
       result.x:=i;
       result.y:=j;
       end;
//     iMatrix[i, j]:=s;
//     iMatrix[j, i]:=s;
     end;
   end;
 end;

var
  a: array[0..4] of integer = (10, -10, 8, 3, -10);

procedure SolveProblem;
var
  r: tpoint;
  o: array of integer;
  i: integer;
 begin
 r:=MaxSumPos(a);
 SetLength(o, r.y-r.x+1);
 for i:=0 to high(o) do
   o[i]:=a[i+r.x];
 //o - output
 end;


 
Паниковский ©   (2004-06-24 07:18) [73]

при собеседовании дали задачку
123 = 1
1234 = 1
12345 = 1
123456 = 1
1234567 = 1

расставте правильно знаки и скобки!


 
SergP ©   (2004-06-24 08:54) [74]


>  [56] panov ©   (23.06.04 17:23)


Что-то мне не нравится этот код, впрочем так-же как и тот с которого его переделали. Думаю он в некоторых случаях все же будет выдавать неверные результаты... Например если в массиве все числа отрицательные...


 
SergP ©   (2004-06-24 09:01) [75]


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


Кстати выходной подмассив может быть пустым? или все же там должно быть не менее одного элемента?


 
Sandman25 ©   (2004-06-24 09:12) [76]

[74] SergP ©   (24.06.04 08:54)

Вот более понятная запись:
if CurrentSum > 0 then
 Inc(CurrentSum, A[I])
else
 CurrentSum := A[I]


 
Bless ©   (2004-06-24 09:30) [77]

Паниковский[73]>
(1+2)/3 = 1
1*2+3-4 = 1
1-2+3+4-5 = 1
(1+2*3+4-5)/6 = 1
1*2+3+4+5-6-7 = 1


 
Sandman25 ©   (2004-06-24 09:35) [78]

[77] Bless ©   (24.06.04 09:30)
При N>=5 есть универсальное решение:
(1+2-3)*(.......)-(N-1)+N=1


 
Паниковский ©   (2004-06-24 09:35) [79]

Bless
я не много не так делал
сказали не правильно((
1*(-2+3) = 1
(-1+2)*(-3+4) = 1
1*(-2+3)*(-4+5) = 1
(-1+2)*(-3+4)*(-5+6) = 1
1*(-2+3)*(-4+5)*(-6+7) = 1


 
Sandman25 ©   (2004-06-24 09:38) [80]

[79] Паниковский ©   (24.06.04 09:35)

Класс.



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

Форум: "Потрепаться";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.61 MB
Время: 0.054 c
1-1088344209
dido
2004-06-27 17:50
2004.07.11
Почему срабатывает KeyDown


10-1019029082
s_alexander
2002-04-17 11:37
2004.07.11
Как сделать соединение с сервером приложений из внешней сети?


1-1088049555
Vilux
2004-06-24 07:59
2004.07.11
Перехват содержимого ClipBoard


3-1087051839
Sectey
2004-06-12 18:50
2004.07.11
Подключение к MS SQL через ADO


3-1087276044
query
2004-06-15 09:07
2004.07.11
1 234 567,000 -->>> 1234567





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский