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

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

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

 
 Ответить  Открыть новую тему 
> одномерный массив
сообщение
Сообщение #1





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

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


Помогите пожалуйста со следующей задачей: Разделить одномерный массив на 3 части, которые по возможности имеют минимальное расхождение сумм. Например: исходный массив - 1 2 3 4 5 6, полученые массивы - 6 1, 5 2, 3 4. Необязательно чтоб в полученном массиве было одинаковое количество чисел. Я пробывал что-то сделать но ответ выводится неправильно. Не понял только как сделать так чтобы выводились 3 массива которые бы включали все введенные числа.
uses crt;
var
a,b:array[1..100] of integer;
n:byte;
sym:integer;sum,k:real;
f:boolean;
i,j,h,s,rab:integer;
begin
{Vvodim vse podryat}
clrscr;
Writeln('Vvedite kolichestvo elimentov massiva<=100');
Readln(n);
for i:=1 to n do
begin
writeln(i,' :eliment');
readln(a[i]);
end;
{sortirovka elementov}
begin
for j:=1 to n-1 do
for i:=1 to n-1 do
if a[i]>a[i+1] then begin
rab:=a[i];
a[i]:=a[i+1];
a[i+1]:=rab;
end;
end;
sym:=0;
for i:=1 to n do
sym:=sym+a[i];
sum:=sym/3;
{Nachinaetsya glavniji cikl
idem sverhu v niz}
for i:=n downto 1 do
begin
s:=1;
b[1]:=a[i];
repeat
h:=1;
k:=sum-a[i]; {vichitaem naibol'shiji eliment podposledovatel'nosti
i nachinaem proveryat' so sledueshigo}
if k=0 then begin write(a[i]);break;end {dobavil proverku pered
ciklom}
else
begin
for j:=i-s downto 1 do
begin
if k<a[j] then continue else {esli eliment bol'she k, to
idem k sleduushimu}
begin
k:=k-a[j];
inc(h);b[h]:=a[j]; {sohronyaem na vsyakji sluchaji}
if k=0 then break; {esli k=0 vihodim iz cikla}
end;
end;
if k=0 then {proviryam esli k=0, to raspichativaem
posledovatel'nost', esli net
to posledovatel'nosti s dannim
naibol'shim chlenom izchrponi, perehodim k
sleduushimu}
begin
writeln;
for j:=1 to h do write(b[j],' ');f:=true;inc(s);
end else f:=false;
end; {konec dobavki}
until not f;
end;
repeat until keypressed;
end.

Заранее благодарен
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Perl. Just code it!
******

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

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


разделение одномерного массива

Хотя нет, там немного другое условие дробления ...

Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


По той ссылке задача решена но немножко не так. При том массиве что там в программе( 12345 ) в ответе выводится 1->1,2->2,3->5. а по программе должно выводится 5 14 23
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

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

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


Цитата
По той ссылке задача решена но немножко не так


Там все решено _так_ просто условие задачи там отличается от твоего, там надо было разбить исходный массив на 3 блока, не перемещая его элементы.


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





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

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


Решил сам программу до конца. Выкладываю код. Возможно кому-то понадобится в будущем.
uses crt;
var a:array[1..100] of integer;
a1,a2,a3:array[1..34] of integer;
prom,n,prom_n:integer;
n1,n2,n3:integer;
sum,nn:real;
i,k,j,m:integer;
begin
clrscr;
write('vvedite kolichestvo elementov massiva(<=100):');
readln(n);
for i:=1 to n do
begin
write('vvedite',i,'element massiva:');
readln(a[i]);
end;
{-------------}
for i:=2 to n do
begin
for j:=1 to i-1 do
begin
if (a[i]>a[j]) then
begin
prom:=a[i];
for k:=i-1 downto j do a[k+1]:=a[k];
a[j]:=prom;
end;
end;
end;
{sum:=0;
for i:1 to n do sum:=sum+a[i];
sum:=sum/3;}
nn:=n/3;
if (frac(nn)=0) then
begin
prom_n:=trunc(nn);
if((prom_n mod 2)=0) then
begin
n1:=trunc(prom_n/2);
n2:=trunc(prom_n/2);
{first array}
j:=1;
for i:=1 to n1 do
begin
a1[j]:=a[i];
j:=j+1;
a1[j]:=a[n-i+1];
j:=j+1;
end;
{second array}
j:=1;
for i:=n1+1 to n1+n2 do
begin
a2[j]:=a[i];
j:=j+1;
a2[j]:=a[n-i+1];
j:=j+1;
end;
{third array}
j:=1;
for i:=n1+n2+1 to n-n1-n2 do
begin
a3[j]:=a[i];
j:=j+1;
end;
n1:=prom_n;
n2:=prom_n;
n3:=prom_n;
end
else
begin
n1:=trunc(prom_n/2)+1;
n2:=trunc(prom_n/2)+1;
{first array}
j:=1;
for i:=1 to n1 do
begin
if(i<n1) then
begin
a1[j]:=a[i];
j:=j+1;
a1[j]:=a[n-i+1];
j:=j+1;
end
else
begin
a1[j]:=a[n-i+1];
j:=j+1;
end;
end;
{second array}
j:=1;
for i:=n1 to n1+n2-1 do
begin
if(i<(n1+n2-1)) then
begin
a2[j]:=a[i];
j:=j+1;
a2[j]:=a[n-i];
j:=j+1;
end
else
begin
a2[j]:=a[n-i];
j:=j+1;
end;
end;
{third array}
j:=1;
for i:=n1+n2 to n-n1-n2+1 do
begin
a3[j]:=a[n-i];
j:=j+1;
end;
n1:=prom_n;
n2:=prom_n;
n3:=n-n1-n2;
end;
end
else
begin
prom_n:=trunc(nn)+1;
if ((prom_n mod 2)=0) then
begin
n1:=trunc(prom_n/2);
n2:=trunc(prom_n/2);
{first array}
j:=1;
for i:=1 to n1 do
begin
a1[j]:=a[i];
j:=j+1;
a1[j]:=a[n-i+1];
j:=j+1;
end;
{second array}
j:=1;
for i:=n1+1 to n1+n2 do
begin
a2[j]:=a[i];
j:=j+1;
a2[j]:=a[n-i+1];
j:=j+1;
end;
{third array}
j:=1;
for i:=n1+n2+1 to n-n1-n2 do
begin
a3[j]:=a[i];
j:=j+1;
end;
n1:=prom_n;
n2:=prom_n;
n3:=n-n1-n2;
end
else
begin
if ((nn-trunc(nn))>0.5) then
begin
n1:=trunc(prom_n/2)+1;
n2:=trunc(prom_n/2)+1;
{first array}
j:=1;
for i:=1 to n1 do
begin
if(i<n1) then
begin
a1[j]:=a[i];
j:=j+1;
a1[j]:=a[n-i+1];
j:=j+1;
end
else
begin
a1[j]:=a[n-i+1];
j:=j+1;
end;
end;
{second array}
j:=1;
for i:=n1 to n1+n2-1 do
begin
if(i<(n1+n2-1)) then
begin
a2[j]:=a[i];
j:=j+1;
a2[j]:=a[n-i];
j:=j+1;
end
else
begin
a2[j]:=a[n-i];
j:=j+1;
end;
end;
{third array}
j:=1;
for i:=n1+n2 to n-n1-n2+1 do
begin
a3[j]:=a[n-i];
j:=j+1;
end;
n1:=prom_n;
n2:=prom_n;
n3:=n-n1-n2;
end
else
begin
n1:=trunc(prom_n/2)+1;
n2:=trunc(prom_n/2);
{first array}
j:=1;
for i:=1 to n1 do
begin
if (i<n1) then
begin
a1[j]:=a[i];
j:=j+1;
a1[j]:=a[n-i+1];
j:=j+1;
end
else
begin
a1[j]:=a[n-i+1];
j:=j+1;
end;
end;
{second array}
j:=1;
for i:=n1 to n1+n2-1 do
begin
a2[j]:=a[i];
j:=j+1;
a2[j]:=a[n-i];
j:=j+1;
end;
{third array}
j:=1;
for i:=n1+n2 to n-n1-n2 do
begin
a3[j]:=a[i];
j:=j+1;
end;
n1:=prom_n;
n2:=prom_n-1;
n3:=n-n1-n2;
end;
end;
end;
write('first array:');
for i:=1 to n1 do
write(a1[i],' ');
writeln(' ');
write('second array:');
for i:=1 to n2 do
write(a2[i],' ');
writeln(' ');
write('third array:');
for i:=1 to n3 do
write(a3[i],' ');
readln;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





- Текстовая версия 23.12.2024 20:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name