Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2009, 15:37   #1
Fraerrrrr
 
Регистрация: 06.05.2009
Сообщений: 3
Радость Задача на Vba либо C++ либо Паскале

Доброго времени суток,Нашел я как-то в одной книге задачу. До сих пор бьюсь над ее решением. Может кто подскажет программу для ее решения (на Visual C++ либо VBA либо Паскаль). Вот текст задачи (на первый взгляд, ничего схожего с программированием):

Парламент состоит из N делегатов. Делегаты должны разделиться на группы (фракции); кол-во депутатов в каждой группе должно отличаться от кол-ва депутатов в любой другой группе. Каждый день каждая фракция посылает одного представителя в некий президиум. Парламент начинает работать в том случае, когда состав президиума отличен от составов президиумов предыдущих дней.
Составить программу, которая бы определяла оптимальное число фракций и кол-во делегатов в каждой из них так, чтобы парламент мог работать как можно дольше. Рассчитанные значения кол-ва делегатов в каждой фракции, сортированные по возрастанию, вывести в выходном текстовом файле.

Короче говоря, нужно разбить N на более простые числа, в сумме дающие это N. Причем начинать надо с двух элементов, рассмотрев все возможные варианты (например, если N=9, то: а=2, b=7 или a=3, b=6, или a=4, b=5). В каждом случае надо найти их наименьшее общее кратное (т.е. НОК(2,7)=14, НОК(3,6)=6, НОК(4,5)=20) и выбрать наибольшее. Точно такую-же операцию надо выполнить для трех элементов, четырех и т.д. В результате должна получиться комбинация чисел в сумме дающее N и имеющее наибольшее наименьшее общее кратное(!простите за тавтологию!). Вот два примера:
N=7: 3 4
N=31: 2 3 5 6 7 8
Низкий поклон тому, кто сможет воплотить это задание в жизнь.
Fraerrrrr вне форума Ответить с цитированием
Старый 06.05.2009, 18:02   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Низкий поклон тому, кто сможет воплотить это задание в жизнь.
Воплотить-то можно всё, вот только зачем?
Для чего тебе нужно решение этой задачи?

Ты же сам писал здесь:
Цитата:
P/S Нашёл эту задачу на Финале Мировой Международной командной олимпиады по программированию
Неужели там не было решения, или имен финалистов, решивших эту задачу?
Обратись к победителям той олимпиады - у них наверняка есть готовый алгоритм
EducatedFool вне форума Ответить с цитированием
Старый 07.05.2009, 04:11   #3
Fraerrrrr
 
Регистрация: 06.05.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение


Неужели там не было решения, или имен финалистов, решивших эту задачу?
Обратись к победителям той олимпиады - у них наверняка есть готовый алгоритм


не всё так просто....
Олимпиада проходила в 1999 году,финалисты-наши с Санкт-Петербурга,это моё курсовое задание по дискретной математике..информацию про Олимпиаду я нашёл в одном старом журнале о программировании,все ссылки оттуда нерабочие,имён не указывается,в общем,
глухо....
Сможете помочь?
Fraerrrrr вне форума Ответить с цитированием
Старый 27.05.2009, 15:30   #4
Fraerrrrr
 
Регистрация: 06.05.2009
Сообщений: 3
По умолчанию

Программа найдена,кто-нибудь поможет с комментариями к ней?
Пожалуйста,буду благодарен


Program Parliament;

var fin,fout:text;
i,k,n,suma,cat,rest,nt:integer;
v,vsol:array[1..1000] of integer;
pmax,pact:extended;

begin
assign(fin,'PARLIAM.IN');
reset(fin);
readln(fin,n);
close(fin);

fillchar(v,sizeof(v),0);
fillchar(vsol,sizeof(vsol),0);

suma:=3;
i:=2;
pmax:=0;
while (suma<=n) do
begin
cat:=(n-suma) div i;
rest:=(n-suma)-(cat*i);

for k:=1 to i do
v[k]:=k+cat;

k:=i;
while (rest>0) do
begin
v[k]:=v[k]+1;
dec(rest); dec(k);
end;

pact:=0;
for k:=1 to i do
pact:=pact+ln(v[k]);

if (pact>pmax) then
begin
pmax:=pact;
move(v,vsol,sizeof(v));
nt:=i;
end;

i:=i+1;
suma:=suma+i;
end;

assign(fout,'PARLIAM.OUT');
rewrite(fout);
write(fout,vsol[1]);
for k:=2 to nt do
write(fout,' ',vsol[k]);
writeln(fout);
close(fout);

end.
Fraerrrrr вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ибо со мной что то не то,либо с паскалем!Поглядите! VHomer Паскаль, Turbo Pascal, PascalABC.NET 7 03.12.2008 22:08
как обращатся к чему либо WOLFak Общие вопросы Delphi 3 13.02.2008 06:06
Как расчитать математическую формулу либо физическую? pentiumForever Общие вопросы Delphi 7 13.09.2007 14:07
Возможности ДубльГИС для интеграции с чем-либо 2gis Софт 2 04.03.2007 03:41