IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Битовые последовательности, Помогите решить задачу
Maksay
сообщение 5.09.2006 18:04
Сообщение #1





Группа: Пользователи
Сообщений: 4
Пол: Мужской
Реальное имя: Андрей Максай

Репутация: -  0  +


Люди, кто любит решать олимпиадные задачи на Pascal'е-помогите решить:
Есть 2 битовых последовательности длины N.
Требуется узнать, можно ли получить из одной
другую посредством переворачивания подпоследовательностей
с четным кол-вом единиц, и если да-то как!
Пример:
011010010 010101010
{011010010
все символы
010010110
с 4 по 7
010101010}
P.S. mad.gif Неделю бъюсь-ничего.Кстати N-до 100.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
Michael_Rybak
сообщение 6.09.2006 13:53
Сообщение #2


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Надеюсь, теперь я правильно понял условие smile.gif

Понятно, что преобразования у нас транзитивные и обратимые.

1) транзитивность – если из строки А можно получить В, а из В – С, то из А можно получить С (очевидно)
2) обратимость – если из А можно получить В, то из В можно получить А (очевидно, нужно просто выполнить операции в обратном порядке)

Теперь попытаемся свести обе входные строки к некоторому каноническому виду.

Будем перемещать все единицы вплотную влево. Для этого все время находим первый нолик, идем от него вправо, пока не встретим вторую по счету единицу, и переворачиваем. В конце концов одна из единиц останется "висеть" (хотя может получится, что она как раз окажется тоже вплотную к остальным). Назовем ее "плавающей".

Например:

11000100110010011011

11000100110010011011
11100100010010011011

11100100010010011011
11110001000010011011

11110001000010011011
11111000010000011011

11111000010000011011
11111100000100001011

11111100000100001011
11111110000100000011

11111110000100000011
11111111000000100001

11111111000000100001
11111111100001000000

В данном случае плавающая единица оказалась на расстоянии 4х нулей от остальных:

11111111100001000000

Даже если бы она оказалась на расстоянии 0 (11111111110000000000), мы все равно ее назвали бы "плавающей".


Из транзитивности и обратимости следует, что, если обе входные строки свелись к одному и тому же каноническому виду, то решение существует.

Рассмотрим пример, для которого ответ - "да":

1) Вход
9
100011100
001011001

Приводим 100011100:

100011100

100011100 - (2,6)
111000100

Приводим 001011001:

001011001

001011001 – (1,5)
101001001

101001001 – (2,6)
110010001

110010001 – (3,9)
111000100

Чтобы получить ответ, выписываем операции для первой строки, а потом, в обратном порядке, операции для второй:

(2,6)
(3,9)
(2,6)
(1,5)


Но теперь, конечно, возникает вопрос, почему нельзя, скажем, из строки 111110010 получить строку 111110001. Докажем, что разные канонические строки неприводимы друг к другу.

В строке рассмотрим группы нулей (в т.ч. пустые), ограниченные по краям единицами, или краями строки. Групп будет на 1 больше, чем единиц. Например, в строке

1100010110

Будет шесть групп, длины 0,0,3,1,0,1 соответственно:

<>1<>1<000>1<0>1<>1<0>

Будем рассматривать общее количество нулей в *нечетных* группах:

<>1<>1<000>1<0>1<>1<0>


Легко проверить, что для нашей задачи эта характеристика является инвариантом, т.е. что переворот произвольной подпоследовательности с *четным* количеством единиц не меняет общего количества нулей в *нечетных* группах. Это объясняется тем, что из-за четности количества единиц все нули, которые были в нечетных группах, попадают опять в нечетные группы, а те, которые были в четных – попадают в четные.

Поэтому, какие бы мы не выполняли перевороты, эта характеристика меняться не будет. А для канонических строк она как раз принимает все значения от 0 до n0, где n0 - количество нулей в строке. Действительно, плавающая единица образует две группы, одна из которых обязательно будет четной, а другая нечетной, а все остальные группы - пустые. n0 возможных положений плавающей единицы соответствуют n0 возможным значениям инварианта.

Поэтому мы доказали, что, если сведя обе входные строки к каноническому виду, мы получили разные результаты, то ответ – "нет".

Кстати, случай, когда количество единиц в строках отличается (или отличается длина строк), учитывать отдельно не нужно – канонические виды тоже получатся разными smile.gif


Сообщение отредактировано: Michael_Rybak - 6.09.2006 13:59
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 8.09.2006 13:05
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Ну вы и монстры, блин smile.gif

Michael_Rybak
Алгоритм интересный, но в реализации будет наверное громоздким. Но у него есть преимущество перед моим - "да" или "нет" он скажет до вывода результата, у меня вычисляется в процессе. Хотя мой тоже можно переделать (просто прогнать 2 раза: 1 раз для "да"-"нет", второй раз результат smile.gif )

Мне непонятен только вот этот пример:
2)Вход:
7
1001001
Изменить невозможно

Почему невозможно, если можно так: 1001001, 1001001 и т.д. ?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Michael_Rybak
сообщение 8.09.2006 15:28
Сообщение #4


Michael_Rybak
*****

Группа: Модераторы
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
Алгоритм интересный, но в реализации будет наверное громоздким


Совсем нет:


{$AppType CONSOLE}

const MAX_N = 128;

type TAr = array [1 .. MAX_N] of longint;

var n0, n1: integer;
a0, b0, a1, b1: TAr;
s0, s1: string;
i, len: integer;

procedure ToCanonic(var s: string; var n: longint; var a, b: TAr);
var i, j, k, ones: longint;
t: char;
begin
n := 0;
for i := 1 to Length(s) do
if s[i] = '0' then begin
ones := 0;
for j := i + 1 to Length(s) do
if s[j] = '1' then begin
Inc(ones);
if ones = 2 then begin
Inc(n);
a[n] := i;
b[n] := j;
for k := i to (i + j) Div 2 do begin
t := s[k];
s[k] := s[i + j - k];
s[i + j - k] := t;
end;
break;
end;
end;
if ones < 2 then
break; //достигли плавающей единицы
end;
end;

begin
Readln(len);
Readln(s0);
Readln(s1);
ToCanonic(s0, n0, a0, b0);
ToCanonic(s1, n1, a1, b1);
if s0 <> s1 then
Writeln('No')
else begin
Writeln('Yes');
for i := 1 to n0 do
Writeln(a0[i], ' ', b0[i]);
for i := n1 downto 1 do
Writeln(a1[i], ' ', b1[i]);
end;
end.


Цитата
Хотя мой тоже можно переделать (просто прогнать 2 раза: 1 раз для "да"-"нет", второй раз результат smile.gif )

А ты можешь доказать правильность своего?

Цитата
Почему невозможно, если можно так: 1001001, 1001001 и т.д.


Согласен.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 8.09.2006 15:54
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


Цитата(Michael_Rybak @ 8.09.2006 16:28) *

А ты можешь доказать правильность своего?

На олимпиадах не требуется доказательство правильности решения задачи, важна работоспособность на тестовых примерах, а на них все работает, так что..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость
сообщение 8.09.2006 16:11
Сообщение #6


Гость






Цитата(Malice @ 8.09.2006 15:54) *
На олимпиадах не требуется доказательство правильности решения задачи, важна работоспособность на тестовых примерах, а на них все работает, так что..
"Так что" ЧТО?

Если я перечислю в программе 5 тестовых примеров с ответами - это что, тоже будет правильным решением? Ведь тестовые варианты проходят... И вторая часть вопроса: кто Вам сказал, что это так же чисто отработает на последовательности из 95 цифр, где могут понадобиться десятки перестановок? Здесь, уважаемый, не олимпиада... no1.gif
 К началу страницы 
+ Ответить 
mlc
сообщение 8.09.2006 17:26
Сообщение #7


Гость






Цитата(Гость @ 8.09.2006 16:11) *

Если я перечислю в программе 5 тестовых примеров с ответами - это что, тоже будет правильным решением?
Ведь тестовые варианты проходят...

Нет, это значит - хочешь проверить, гоняй на своих тестовых примерах, доказывай, что неправильно. Приводить ход своих размышлений, алгоритм работы, объяснить как оно работает я не обязан. Форум программистов, а не философов-разговорников, да и тема в "Задачах", а не в теор. вопросах.
Цитата
И вторая часть вопроса: кто Вам сказал, что это так же чисто отработает на последовательности из 95 цифр, где могут понадобиться десятки перестановок?

А что ей помешает ? Запутается ? smile.gif А если миллион, а у вас 4 массива, и что ? smile.gif
Цитата
Здесь, уважаемый, не олимпиада... no1.gif

Условия одни-главное, чтоб работало..
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Maksay   Битовые последовательности   5.09.2006 18:04
klem4   Может быть вариант что нам для получения придется ...   5.09.2006 19:58
volvo   В дополнение к предыдущему вопросу: может ли понад...   5.09.2006 20:03
klem4   Volvo, и на твой вопрос ответ судя по всему тоже д...   5.09.2006 20:06
volvo   Тогда есть высокая (очень высокая) вероятность тог...   5.09.2006 20:11
Maksay   Извиняюсь, пример действительно неудачный.Перевора...   5.09.2006 20:34
Malice   У меня вот такой алгоритм получился: uses crt; va...   5.09.2006 23:04
Michael_Rybak   В условии сказано: подпоследовательностей с четным...   6.09.2006 3:03
Coder_perm   В условии сказано: подпоследовательностей с четны...   6.09.2006 6:41
Michael_Rybak   >1. Переворачивать, не значит менять 0 на 1 и о...   6.09.2006 12:03
Michael_Rybak   Надеюсь, теперь я правильно понял условие :) Поня...   6.09.2006 13:53
lapp   Понятно, что преобразования у нас транзитивные и ...   7.09.2006 13:48
Malice   Ну вы и монстры, блин :) Michael_Rybak Алгоритм и...   8.09.2006 13:05
Michael_Rybak   Совсем нет: {$AppType CONSOLE} const MAX...   8.09.2006 15:28
Malice   А ты можешь доказать правильность своего? На оли...   8.09.2006 15:54
Гость   На олимпиадах не требуется доказательство правильн...   8.09.2006 16:11
mlc   Если я перечислю в программе 5 тестовых примеров ...   8.09.2006 17:26
Michael_Rybak   А эту задачу можно сдать на каком-нибудь онлайн ар...   6.09.2006 14:28
volvo   Нет возможности узнать достоверно, что имеется в в...   7.09.2006 14:59
Michael_Rybak   >Найдешь преобразование, переводящее из А в С? ...   7.09.2006 16:12
lapp   > > Найдешь преобразование, переводящее из А...   7.09.2006 23:58
Michael_Rybak   > > > Найдешь преобразование, переводящее...   8.09.2006 12:30
Гость   я нашел тест который не работает через вышеуказанн...   24.12.2010 13:56
Гость   я нашел тест который не работает через вышеуказан...   24.12.2010 13:58
Saken   блин сорри там 9 а не шесть блин ошибся :wacko:...   24.12.2010 15:13


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.07.2025 2:31
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"