Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2] 3  Все   Вниз
  Печать  
Автор Тема: Нужны задачки  (Прочитано 76286 раз)
0 Пользователей и 1 Гость смотрят эту тему.
rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #30 : 21-02-2008 09:06 » 

правильно сказал Finch, что это жадный алгоритм. Скупой платит дважды.
имеем камни (кг) 1, 2, 3, 4. По твоему, алгоритму, получается две кучи 4 (1 и 3) кг и 6 (2 и 4)кг.
Оптимальный вариант -  1 и 4, 2 и 3.
Задача осталась не решенной. Мой вариант есть. Могу выложить. Выложить? Только в псевдокоде.
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #31 : 21-02-2008 09:11 » 

Лёш, я не подбираю две кучки камней с одинаковой массой. Я НАБИРАЮ из ВСЕХ камней массу равную половине исходной массы. Конечно я сначала её отсортирую. А потом перебеор будет уже оптимирован.

Согласен, что ты сделаешь перебор быстрей. Но вот только будет ли это решением задачи, требованием которой является минимальная разница? Это носит вероятностный характер. Повезёт - да, но в самом общем случае - нет.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #32 : 21-02-2008 09:12 » 

Задача осталась не решенной. Мой вариант есть. Могу выложить. Выложить? Только в псевдокоде.

А чем тебе мой не подходит?
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #33 : 21-02-2008 09:21 » 

rumpelstilschen, по моему алгоритму получается:
-------------
1) куча: 1,2,3,4
н1:пусто
н2:пусто

ищем самый тяжелый , это 4

2) куча: 1,2,3
н1: 4
н2:пусто

масса набора 1 больше набора 2, переключаемся на набор 2
ищем самый тяжелый , это 3

3)
куча: 1,2
н1: 4
н2: 3

масса набора 2 НЕ больше набора 1
ищем самый тяжелый , это 2

4)
куча: 1
н1: 4
н2: 3,2

масса набора 2 больше набора 1, переключаемся на набор 1
ищем самый тяжелый , это 1

5)
куча: пусто
н1: 4,1
н2: 3,2

-------------


Джон, нету там никакой вероятности, алгоритм обеспечит точную подгонку, согласись. Или покажи глюк Улыбаюсь


rumpelstilschen, давай своё решение
« Последнее редактирование: 21-02-2008 09:23 от Алексей1153++ » Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #34 : 21-02-2008 09:43 » 

Джон: да, решений много и твой работает.

Алексей1153++: у меня просто другой алгоритм. сейчас, найду и покажу
« Последнее редактирование: 21-02-2008 09:45 от rumpelstilschen » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #35 : 21-02-2008 09:46 » 

это просто клёво, когда есть много решений Улыбаюсь
Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #36 : 21-02-2008 09:56 » new

В футбол в детстве играли?
Два человека начинают поочередно набирать себе команду
в результате почти одинаковые команды получались

Здесь же можно пойти по другому пути
Тяжелый - легкий

Но! в таком случае количество камней в кучах будет одинаково.


Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #37 : 21-02-2008 10:02 » 

вот например
4 3 1 2
первая куча 4 1
вторая 3 2

но, а если
4 3 1?
первая куча 4
вторая 3 1
моя пошла думать...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #38 : 21-02-2008 10:07 » 

Слав, всё правильно , и даже если
10,1,1,1,1,1,1

будет

10
1,1,1,1,1,1

всё, сходицо
Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #39 : 21-02-2008 10:17 » 

1. 4 камня, возводим в квадрат. Получаем 16 блоков.
2. в каждом блоке по 2 секции - "кучи"
3. распределяем каждый камень таким образом, чтобы он прошел по каждой куче, каждого блока, но так, чтоб "свзаимодействовал" с каждым камнем, рапределенным таким же способом.
4. в каждом блоке вычитаем из большей кучи, кучу меньшую.
5. получаем результат наименьшего значения по требуемому условию

Плюсы: нейронная сортировка.
Минусы: большой объем задействованных ресурсов, если использовать линейный метод. При оптимизации, ресурсо-требуемость сокращается.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #40 : 21-02-2008 10:30 » 

Цитата
1. 4 камня, возводим в квадрат. Получаем 16 блоков.

ага... 100000 камней возводим в квадрат... Таких кампутеров тогда ещё не было Отлично

Цитата
2. в каждом блоке по 2 секции - "кучи"
3. распределяем каждый камень таким образом, чтобы он прошел по каждой куче, каждого блока, но так, чтоб "свзаимодействовал" с каждым камнем, рапределенным таким же способом.
4. в каждом блоке вычитаем из большей кучи, кучу меньшую.
5. получаем результат наименьшего значения по требуемому условию

а зачем именно так? Тем более, что и непонятно. Если хочется перебрать все варианты сочетаний из N камней - заведи N*2 -разрядное двоичное число, и инкреминируй от 0 и до переполнения (2^(N*2)) .
Отсеивай только те числа, в которых 10 бит.
Интерпретируй так: первые Nбит - маска для первого набора, последние N бит - маска для второго.
Также отсеивай случаи, когда биты в масках пересекаются (то есть когда Mask1 & Mask2 не равно 0)

из подходящих сочетаний выбери те, которые имеют меньшую разницу в суммарной массе. Усё.


Код:
Плюсы: нейронная сортировка.
где тут нейроны?

Код:
Минусы: большой объем задействованных ресурсов, если использовать линейный метод. При оптимизации, ресурсо-требуемость сокращается.
ага, много кода, много озу
Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #41 : 21-02-2008 10:33 » 

>где тут нейроны?

камни
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #42 : 21-02-2008 10:34 » 

это круто. Зачем такая самокритика, не надо Отлично
Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #43 : 21-02-2008 10:42 » 

взаимодействие между камнями - нейронные связи.
нейронных связей в мозгу человека - больше чем атомов во вселенной. )
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #44 : 21-02-2008 10:46 » 

ну про атомы во вселенной это ты конечно загнул... Если бы ДАЖЕ каждая связь состояла из одного атома, то этого бы всё равно не получалось бы Улыбаюсь

нейрон - это запоминающий элемент со связями (камень не катит)

Кстати, ещё можно было бы использовать генетический алгоритм, озу потребуется с понты, но долго вычисляться будет Улыбаюсь
Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #45 : 21-02-2008 10:48 » 

>генетический алгоритм

это что?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #46 : 21-02-2008 10:50 » 

вот...
1 куча -> самый тежелый из остатка
проверка на вес кучи с весом последнего тяжелого камня из остатка
2 куча -> самый тяжелый из остатка или вся оставшаяся куча

4 1 1 1
1. 4
2. 1 1 1

4 3 2
здесь можно ввести еще одно условие на проверку... (отдав предпочтение последнего камня второй куче)
1. 4
2. 3 2

9 8 3 2 1 1 1 1
1. 9 1 3
2. 8 1 2 1 1
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #47 : 21-02-2008 10:57 » 

rumpelstilschen, это алгоритм, где моделируется содранный у природы естественный отбор , вкратце не смогу рассказать - сам никогда не пользовался. Поищи. Штука занятная ) . Там правила некоторые (так же из природы) - каков процент мутации параметров, перекрёстный обмен генами, передача наследственности. Ну и вычисляется это всё долго, конечно
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #48 : 21-02-2008 11:00 » 

Слав, а в моём алгоритме получается
1:9211
2:8311
Записан

Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #49 : 21-02-2008 11:25 » 

Алексей1153++, в твоем алгоритме уравнивается команды в правах, предпочтение отдается слабому...

+1
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #50 : 21-02-2008 11:35 » 

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

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #51 : 21-02-2008 11:38 » 

Алексей1153++, твой алгоритм надо тестировать. а мой не надо.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #52 : 21-02-2008 11:40 » 

да твой ещё не написан, а мой вовсю работает ) Покажи мне исходные данные, при которых будет косяк?
Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #53 : 21-02-2008 11:42 » 

>Покажи мне исходные данные, при которых будет косяк?

Алексей1153++, говорю, не знаю, тестировать нужно. Сам алгоритм тестировать. Не прогу.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #54 : 21-02-2008 11:46 » 

rumpelstilschen, так мы его уже оттестировали Улыбаюсь
А почему твой тестировать не надо? У тебя что самопроверяющийся алгоритм?
А у Лешки работающий, даже в тяжелых условиях.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #55 : 21-02-2008 11:47 » 

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

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #56 : 21-02-2008 11:48 » 

rumpelstilschen , программу я не писал, я на работе, другой программой занят. А алгоритм интуитивный. А давай, напиши программу , если не лень, заодно и проверим ) И RND прикрути для тестов
« Последнее редактирование: 21-02-2008 11:50 от Алексей1153++ » Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #57 : 21-02-2008 11:53 » 

Sla, мой тестировать не надо, потому что он рассматривает все варианты конфигурации камней, и выбирает тот, который требуется по условию.

Алексей1153++, сейчас нет. я занят. на мне 2 курсовика висят )
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #58 : 21-02-2008 12:31 » 

курсовики, говоришь... А вот программа
Код:
{
//исходная куча
const int SourceHeap[]={1,2,3,4,5,6,7,8,9};

int N=sizeof(SourceHeap)/sizeof(*SourceHeap);

//рабочая куча
int* WorkCommonSet=new int[N];
::memmove(WorkCommonSet,SourceHeap,N*sizeof(*SourceHeap));

//наборы
int* Set1=new int[N];
int* Set2=new int[N];
::memset(Set1,0,N*sizeof(*Set1));
::memset(Set2,0,N*sizeof(*Set2));

//не сортируем WorkCommonSet, будем так искать максимальный
//элемент, а потом заменять на 0 после использования

int S=1;//текущая куча
int W1=0;//вес набора 1
int W2=0;//...2
int N1=0;//камней в наборе 1
int N2=0;//...2

for(;;)
{
//ищем в общей куче максимальный элемент, вес его - maxStoneW
int maxStoneW=0;
int* pMax=0;

int* p=WorkCommonSet;
for(int i=0;i<N;i++,p++)
{
if(*p)
{
if(*p > maxStoneW)
{
maxStoneW=*p;
pMax=p;
}
}
}

//если не найдено ничего - выход
if(!maxStoneW)break;

//вытаскиваем камень из общей кучи
*pMax=0;


if(S==1)
{
//кладём камень в набор 1
Set1[N1]=maxStoneW;
N1++;
W1+=maxStoneW;

if(W1>W2)
{
S=2;
}

}
else
{
//кладём камень в набор 2
Set2[N2]=maxStoneW;
N2++;
W2+=maxStoneW;

if(W2>W1)
{
S=1;
}
}
}
//Set1 и Set2 - результат , N1 и N2 - длины массивов
delete [] WorkCommonSet;
WorkCommonSet=0;

delete [] Set1;
Set1=0;

delete [] Set2;
Set2=0;

}
« Последнее редактирование: 21-02-2008 12:34 от Алексей1153++ » Записан

rumpelstilzchen
Тролль
*
ru
Offline Offline

« Ответ #59 : 21-02-2008 12:48 » 

я не провел алгоритм по исходнику. должно получится 2 кучи. 22 кг и 23 кг. получил ехешник? дай посмотреть. и исходник тоже, полностью.

ты удалил указатель           >  delete [] Set1;
а потом его инициализируешь   >  Set1=0;

разве так можно?
« Последнее редактирование: 21-02-2008 12:57 от rumpelstilschen » Записан
Страниц: 1 [2] 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines