Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.210.12] |
|
Страницы: (2) 1 [2] все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Цитата Cubloid, 14.10.02, 18:09:26 Demo_S, написанный вами выше вариант, как я понял. Очень похож на приведенный мною выше? да, только я делал основной упор на общую идею... а привел какую-то реализацию, первую что пришла в голову.. которая совпадает с твоей идеей. наверняка можно ускорить... тем более посмотри то что предложил тебе Губанов... там тоже длинное не всегда правлипьное осуждение.. но к чему-то оно привело:) ЗЫ почему ты думаешь, что этот способо будет медленным? ИМХО все зависит от того, как написать:) |
Сообщ.
#17
,
|
|
|
вот алгоритм
для простоты рассмотрим числа 1 2 3 а не -1 0 1 но это не меняет сути поясню с помощью примере пусть есть числа 1 1 1 2 2 3 пусть начинаем с наименьшего числа и хотим в конце получить наибольшее тоесть 111223 первое число и соответственно 322111 последнее и так как делать переход от одного числа к последующему? достаточно просто. если посмотреть на последнее число с конца то можно увидеть что его цифры дают не убывающию последовательность! ага. и так ищем первую цифру с конца которая нарушает неубывающию последовательность например для 111322 мы видим что это правая единица второй этап из всех чисел от правой единицы выбираем то которое меньше всего, в нашем случае 2 на место 1 пишем два получили 112 а оставшиеся числа сортируем и приписываем в возтастающем порядке то есть получим 112123 и тп. по алгоритму получаем 112132 112213 время построение линейно, и меньшего с точки зрения комплексити не добиться ибо надо пройти все числа числа с наилучшими |
Сообщ.
#18
,
|
|
|
Вообщем всем спасибки.
Особенно за последний пост Esperanto. В результате на коленках реализовал следущее Цитата #include <stdio.h> #include <string.h> int main() { char str[20]; strcpy(str,"111223"); printf ("1\t\%s\n",str); int n; int k; int t; int y; n=strlen(str)-1; int ttt=1; while(ttt++) { k=n-1; while ((str[k]>=str[k+1])&&(k>=0)) k--; if (k<0) {return(0);} t=k+1; while ((t<n)&&(str[t+1]>str[k])) t++; y=str[k]; str[k]=str[t]; str[t]=y; printf ("\%d\t\%s\t",ttt,str); t=0; while (t<(int)((double)(n-k)/2.0)) { y=str[n-t]; str[n-t]=str[k+1+t]; str[k+1+t]=y; t++; } printf ("\%s\n",str); } } |
Сообщ.
#19
,
|
|
|
Всем огромное спасибо за участие в обсуждении.
Проблема нашла свое решение. Хотя если у кого-то есть более быстрое решение. Милости просим, всегда готов рассмотреть. Всем еще раз спасибо. |