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

Вниз

Задачка для разминки мозга   Найти похожие ветки 

 
Inovet ©   (2014-04-30 14:57) [240]

Да, вывод:

{V,e,r,y, ,p,r,e,t,t,y, ,l,i,s,t}
{}
{L}
{L and 2}
{S,h,L}


 
MBo ©   (2014-04-30 15:06) [241]

>Inovet
Идея понятна, но форматирование для случая "больше двух" не то


 
Inovet ©   (2014-04-30 15:31) [242]

> [241] MBo ©   (30.04.14 15:06)
> но форматирование для случая "больше двух" не то

А, там же надо тоже "и", ну тогда ещё проще - достаточно 2 последних помнить

Вывод:

{V,e,r,y, ,p,r,e,t,t,y, ,l,i,s and t}
{}
{L}
{L and 2}
{S,h and L}


Так есть ли способ "не тупо"?


 
Inovet ©   (2014-04-30 15:37) [243]

> [242] Inovet ©   (30.04.14 15:31)

Ну и второй тупой вариант более "медленный" - подставлять разделитель прямо в цикле, например, по значению счётчика.


 
SergP ©   (2014-04-30 22:28) [244]


> Дана квадратная матрица NxN, содержащая единицы и нули.
> Требуется без использования дополнительной памяти (т.е.
> с O(1)) обнулить те столбцы и строки, в которых есть нули.
>


А тип данных в матрице позволяет присваивать элементам матрицы значения отличные от 0 и 1 ?


 
MBo ©   (2014-05-01 07:23) [245]

>А тип данных в матрице позволяет присваивать элементам матрицы значения отличные от 0 и 1 ?

Нет


 
Inovet ©   (2014-05-01 09:39) [246]

> [236] MBo ©   (30.04.14 13:28)
> Zero-Matrix

Идём по диагонали, смотрим стороны текущей матрицы. Если встречается 0, сбрасываем в 0 уже пройденные элементы строки или столбца. Т.о. дополнительная память не требуется, и внесённые изменения не влияют на результат.

Вроде, так должно работать.


 
SergP ©   (2014-05-01 11:24) [247]

Вот как-то так вроде, если я не ошибся...
Смысл в том, что сначала ищем строку N, где отсутствуют нулевые элементы.
(если такой строки нет, то всю матрицу можно обнулять).
Если есть, то запоминаем ее, проверяем все столбцы на наличие нулевых элементов и обнуляем те элементы строки N, в столбцах которых есть нулевые элементы.
Т.е. мы получили конечный вариант строки N

Далее проходим по всем строкам, кроме строки N
если в строке есть нулевой элемент, обнуляем строку, если нет - то копируем на ее место строку N

 
 // пусть массив у нас будет Arr[0..xmax,0..ymax]
 // var
 // f1,f2:boolean;
 // x,y,i,j,n:integer;
 // ищем строку где нет нулевых элеменетов

 f2:=false;
 for y:=0 to ymax do
 begin
   f1:=true;
   for i:=0 to xmax do if Arr[i,y]=0 then f1:=false;
   if f1 then
   begin
     n:=y;  // если такая строка существует то запоминаем ее в N
     f2:=true;
     break;
   end;
 end;

 if f2 then
 begin
   // строка где нет нулевых элементов существует, ее номер в N
   // проверяем все столбцы на наличие нулевых элементов
   //
   for x:=0 to xmax do
   begin
     f1:=false;
     for j:=0 to ymax do if Arr[x,j]=0 then f1:=true;
     // если в столбще есть нулевые элементы то обнуляем соответствующий элемент в строке N
     if f1 then Arr[x,n]:=0;
   end;
   // проходим все строки кроме строки N
   for y:=0 to ymax do
   begin
     if y=n then continue;
     f1:=true;
     for i:=0 to xmax do if Arr[i,y]=0 then f1:=false;
     // Если в строке нет нулевых элементов, заменяем ее копией строки N, иначе обнуляем
     for x:=0 to xmax do if f1 then Arr[x,y]:=Arr[x,n] else Arr[x,y]:=0;
   end;
  // если в каждой строке имеются нулевые элементы то обнуляем весь массив
 end else for x:=0 to xmax do for y:=0 to ymax do Arr[x,y]:=0;


 
SergP ©   (2014-05-01 11:39) [248]

ну можно еще немного оптимизировать, увеличивши размер кода.

Во первых, заменить подобные вещи (проверка строки или столбца на наличие нулевых элементов:
вместо:

f1:=false;
for j:=0 to ymax do if Arr[x,j]=0 then f1:=true;


написать:

f1:=false;
for j:=0 to ymax do if Arr[x,j]=0 then
begin
  f1:=true;
  break;
end;


ну и не проверять повторно строки от 0 до N во второй части:
for y:=0 to ymax do
  begin
    if y=n then continue;
    f1:=true;
    for i:=0 to xmax do if Arr[i,y]=0 then f1:=false;
    // Если в строке нет нулевых элементов, заменяем ее копией строки N, иначе обнуляем
    for x:=0 to xmax do if f1 then Arr[x,y]:=Arr[x,n] else Arr[x,y]:=0;
  end;


а сразу их обнулять:
for y:=0 to ymax do
  begin
    if y=n then continue;
    if y<0 then for i:=0 to xmax do a[i,y]:=0 else
    begin
      f1:=true;
      for i:=0 to xmax do if Arr[i,y]=0 then f1:=false;
      // Если в строке нет нулевых элементов, заменяем ее копией строки N, иначе обнуляем
      for x:=0 to xmax do if f1 then Arr[x,y]:=Arr[x,n] else Arr[x,y]:=0;
    end;
  end;


 
SergP ©   (2014-05-01 11:44) [249]

типа так:
 // ищем строку где нет нулевых элеменетов
 f2:=false;
 for y:=0 to ymax do
 begin
   f1:=true;
   for i:=0 to xmax do if Arr[i,y]=0 then
   begin
     f1:=false;
     break;
   end;

   if f1 then
   begin
     n:=y;  // если такая строка существует то запоминаем ее в N
     f2:=true;
     break;
   end;
 end;

 if f2 then
 begin
   // строка где нет нулевых элементов существует, ее номер в N
   // проверяем все столбцы на наличие нулевых элементов
   //
   for x:=0 to xmax do
   begin
     f1:=false;
     for j:=0 to ymax do if Arr[x,j]=0 then
     begin
       f1:=true;
       break;
     end;
     // если в столбще есть нулевые элементы то обнуляем соответствующий элемент в строке N
     if f1 then Arr[x,n]:=0;
   end;
   // проходим все строки кроме строки N
   for y:=0 to ymax do
   begin
     if y=n then continue;
     if y<0 then for i:=0 to xmax do Arr[i,y]:=0 else
     begin
       f1:=true;
       for i:=0 to xmax do if Arr[i,y]=0 then
       begin
         f1:=false;
         break;
       end;
       // Если в строке нет нулевых элементов, заменяем ее копией строки N, иначе обнуляем
       for x:=0 to xmax do if f1 then Arr[x,y]:=Arr[x,n] else Arr[x,y]:=0;
     end;
   end;
  // если в каждой строке имеются нулевые элементы то обнуляем весь массив
 end else for x:=0 to xmax do for y:=0 to ymax do Arr[x,y]:=0;


 
SergP ©   (2014-05-01 11:46) [250]

хм. ошибка небольшая.

вот так нужно:

 // ищем строку где нет нулевых элеменетов
 f2:=false;
 for y:=0 to ymax do
 begin
   f1:=true;
   for i:=0 to xmax do if Arr[i,y]=0 then
   begin
     f1:=false;
     break;
   end;

   if f1 then
   begin
     n:=y;  // если такая строка существует то запоминаем ее в N
     f2:=true;
     break;
   end;
 end;

 if f2 then
 begin
   // строка где нет нулевых элементов существует, ее номер в N
   // проверяем все столбцы на наличие нулевых элементов
   //
   for x:=0 to xmax do
   begin
     f1:=false;
     for j:=0 to ymax do if Arr[x,j]=0 then
     begin
       f1:=true;
       break;
     end;
     // если в столбще есть нулевые элементы то обнуляем соответствующий элемент в строке N
     if f1 then Arr[x,n]:=0;
   end;
   // проходим все строки кроме строки N
   for y:=0 to ymax do
   begin
     if y<n then for i:=0 to xmax do Arr[i,y]:=0;
     if y>n then
     begin
       f1:=true;
       for i:=0 to xmax do if Arr[i,y]=0 then
       begin
         f1:=false;
         break;
       end;
       // Если в строке нет нулевых элементов, заменяем ее копией строки N, иначе обнуляем
       for x:=0 to xmax do if f1 then Arr[x,y]:=Arr[x,n] else Arr[x,y]:=0;
     end;
   end;
  // если в каждой строке имеются нулевые элементы то обнуляем весь массив
 end else for x:=0 to xmax do for y:=0 to ymax do Arr[x,y]:=0;


 
Sha ©   (2014-05-01 12:50) [251]


const
 h= 4;
type
 TElement= byte;
var
 m: array[0..h, 0..h] of TElement= (
   (1, 0, 1, 1, 0),
   (0, 1, 1, 1, 0),
   (1, 1, 1, 1, 1),
   (1, 0, 1, 1, 1),
   (1, 1, 1, 1, 1));
procedure TForm1.Button3Click(Sender: TObject);
var
 col0: TElement;
 i, j: integer;
begin;
 col0:=1;
 for i:=0 to h do begin;
   if m[i,0]=0 then col0:=0;
   for j:=1 to h do if m[i,j]=0 then begin;
     m[i,0]:=0;
     m[0,j]:=0;
     end;
   end;
 for j:=1 to h do if m[0,j]=0 then for i:=1 to h do m[i,j]:=0;
 for i:=0 to h do if m[i,0]=0 then for j:=1 to h do m[i,j]:=0;
 if col0=0 then for i:=0 to h do m[i,0]:=0;
 //for i:=0 to h do Memo1.Lines.Add(Format("%d %d %d %d %d",
 //  [m[i,0],m[i,1],m[i,2],m[i,3],m[i,4]]));
 end;


 
Гора Фудзияма   (2014-05-05 15:19) [252]

Удалено модератором


 
KSergey ©   (2014-05-06 12:52) [253]

> Rouse_ ©   (16.04.14 23:26) [26]
> Result := (A * B - 6930 + (A xor B) - 23) <> 0;

Byte * Byte дает Integer ??
сволочи


 
Sha ©   (2014-05-07 20:26) [254]

> KSergey ©   (06.05.14 12:52) [253]

Это так для всей арифметики, а если один операнд int64 - то и результат int64.
Для логики иначе.


 
Sha ©   (2014-05-07 21:55) [255]


function Not1(a: byte): integer;
begin;
   Result := not (a or 0); //= not byte(a)
  end;

function Not2(a: byte): integer;
begin;
  Result := not (a+0); //неожиданный, но соответствующий описанию результат = not integer(a)
  end;

function Shl1(a: byte): integer;
begin;
  Result := byte(a shl 8); //=byte(integer(a) shl 8)
  end;

function Shl2(a: byte): integer;
begin;
  Result := a shl 8; //ожидаемый, но не соответствующий описанию результат = integer(a) shl 8
  end;

procedure TForm1.Button8Click(Sender: TObject);
begin;
  ShowMessage(IntToStr(Not1(1)));
  ShowMessage(IntToStr(Not2(1)));
  ShowMessage(IntToStr(Shl1(1)));
  ShowMessage(IntToStr(Shl2(1)));
  end;


 
Sha ©   (2014-05-14 13:49) [256]

Не поднять ли нам ветку?

За один проход по элементам целочисленного массива найти 0..5 непарных чисел.

Это типа намек как решать [208].


 
han_malign   (2014-05-15 12:52) [257]


> За один проход по элементам целочисленного массива найти 0..5 непарных чисел.

{1 shl k, 1 shl m, 1 shl k + 1 shl m, n, n}
- ну нету медианы...


 
Sha ©   (2014-05-15 14:00) [258]

вроде и не требуется она для решения


 
Дмитрий СС   (2014-05-15 18:36) [259]

А была тут такая задача:
Известны A и B:
A = x xor y
B = x + y
Найти x и y.


 
Sha ©   (2014-05-16 00:48) [260]

> Дмитрий СС   (15.05.14 18:36) [259]

может получиться довольно много решений


 
han_malign   (2014-05-16 08:50) [261]


> вроде и не требуется

- в задаче о 2-х - медиана - это один из битов разницы, по которому надо делить свертку выборки...
позволяет обойтись честным O(1) по памяти(с двумя проходами)

- свертка по всем срезам  [бит,значение] - вроде позволяет найти все значения(и не факт что 5 - предел)...
но если по правильному(N => &#8734;) - это все-таки O(ln N) - по памяти...
(т.к. с таким же успехом можно заявить, что 512 Mб битовая строка - это O(1) - т.к. не зависит от N)


 
Sha ©   (2014-05-16 09:27) [262]

> han_malign   (16.05.14 08:50) [261]

Тем не менее это ничуть не мешает решает решить задачу поиска трех чисел ценой увеличения количества проходов или памяти в b раз (b - количество используемых битов в числах).

По моим экспериментам, похожим образом задача решается для 4, 5 и 6 чисел. Дальше не смотрел, т.к. там довольно громоздко все получается и в лоб уже не выходит вроде.

Для 4 чисел есть строгое доказательство и решение в 1 проход. Небольшой намек на решение дан в конце статьи в блоге.



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

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

Наверх





Память: 1.03 MB
Время: 0.033 c
6-1274251810
Dmitriy
2010-05-19 10:50
2014.12.14
контроль (учет) трафика WinInet


15-1399721808
Дмитрий СС
2014-05-10 15:36
2014.12.14
Сделать из ноута bluetooth/usb клавиатуру.


15-1400002027
Kerk
2014-05-13 21:27
2014.12.14
Вызов Free внутри класса


15-1400013003
Юрий
2014-05-14 00:30
2014.12.14
С днем рождения ! 14 мая 2014 среда


3-1301760583
worldmen
2011-04-02 20:09
2014.12.14
Запрос списка уволенных





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