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

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

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

 
 Ответить  Открыть новую тему 
> индекс пермутации, задачка на комбинаторику
Bard
сообщение 24.04.2007 7:52
Сообщение #1


Учиться, учиться еще раз учиться
***

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

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


нам учитель вчера задал такую задачку unsure.gif :
задается N и сама пермутация длины N. требуеться найти индекс этой пермутации в N!

пример:
4
2 3 1 4
ответ: 17

пример:
5
5 4 3 2 1
ответ: 120

и т.д

помогите пожалуйста с реализацией алгоритма... rolleyes.gif

спс за внимание(заранее) smile.gif


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
samec
сообщение 24.04.2007 10:03
Сообщение #2


Бывалый
***

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

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


есть алгоритм генерации всех перестановок N-элементного множества в лексикографическом порядке. Посмотреть можно тут: Перестановки
Так вот:
1) заводим переменную, для подсчёта перестановок.
2) генерируем очередную перестановку(при этом увеличиваем индекс нашей переменной)
3) сравниваем её со своей (заданной) пермутацией, и если одно и то же, то решением задачи будет значение нашей переменной
вродеб всё.

Сообщение отредактировано: samec - 24.04.2007 10:05
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bard
сообщение 24.04.2007 10:37
Сообщение #3


Учиться, учиться еще раз учиться
***

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

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


спасибо за помощь но этот путь я уже давно хотел предпринять wink.gif но учитель сказал что надо метод попроще найти yes2.gif ...твой алгоритм занимает очен много времени mega_chok.gif

кстати N<100 wacko.gif


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.04.2007 11:18
Сообщение #4


Гость






АлгоЛист -> Операции с перестановками (см. PermutationNum)
 К началу страницы 
+ Ответить 
Bard
сообщение 15.05.2007 15:11
Сообщение #5


Учиться, учиться еще раз учиться
***

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

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


а нету ли чего нибудь на паскале??? good.gif


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.05.2007 16:16
Сообщение #6


Гость






Дельфийский код переносится на Паскаль практически один в один...

Добавлено через 2 мин.
Я, кстати уже выкладывал код функции PermutationNum, который отрабатывает в Турбо Паскале здесь: Число
 К началу страницы 
+ Ответить 
Bard
сообщение 15.05.2007 20:18
Сообщение #7


Учиться, учиться еще раз учиться
***

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

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


Цитата

Вот так попробуй:

function Fact(n: integer): longint;
var
i: integer;
T: longint;
begin
T := 1;
for i := 1 to n do T := T * i;
Fact := T;
end;

function PermutationNum(const A : array of integer; N : Integer): longint;
var
T, i, j: integer;
F: longint;
theResult: longint;
begin
if N <= 0 then begin
PermutationNum := 0; Exit;
end;

I:=1;
while I <= N do begin

if (A[I]<1) or (A[I]>N) then begin
PermutationNum := 0; Exit;
end;
Inc(I);

end;

theResult := 0;
F := 1;
I := 1;
while I <= N do begin
F := F*I;
Inc(I);
end;

I := 1;
while I <= N-1 do begin
F := F div (N+1-I);
T := A[I]-1;
J := 1;
while J <= I-1 do begin
if A[J]<A[I] then begin
T := T-1;
end;
Inc(J);
end;
theResult := theResult + F*T;
Inc(I);
end;
theResult := theResult + 1;
PermutationNum := theResult;
end;

const
n: integer = 3;
var
arr: array[0 .. 8] of integer;
s: string;
i: integer;
p, total: longint;

begin
write('n = '); readln(n);
write('number[', n, ' chars] = '); readln(s);

arr[0] := 0;
for i := 1 to n do arr[i] := ord(s[i]) - ord('0');

p := PermutationNum(arr, n);
total := Fact(n);
writeln(total - p);
end.


(вводишь сначала n - не больше 8, потом в виде строки само число из n цифр...)

Volvo, если тебя не затруднит подскажи что делает эта прога??? blink.gif
при n=5 и s='12345' ответ=119 mega_chok.gif ...
почему это так? wacko.gif

Добавлено через 6 мин.
помоему я нашел... надо просто стереть функцию Fact и написать writeln(p); вместо writeln(total-p);...
вот и все... огромное спасибо за помощь Volvo


--------------------
Чтобы поразить цель важна не точность, а смелость
Шарль Луи Монтескё
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 15.05.2007 20:27
Сообщение #8


Гость






Ну, да... Там же немного другая задача стояла... Тебе достаточно WriteLn(p) ...
 К началу страницы 
+ Ответить 

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

 



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