кроссворды, задачки, головоломки

Сборник задач разного уровня сложности по математике, информатике, физике, химии, программированию, экономике etc. Логические задачи, SQL задачи, решение задач. Задачи с ответами, а также нерешённые задачи.

Petruchek.Info

n групп по n чисел

Добавлено: 10.02.09 в 12:00
Метки: информатика

Разбить числа от 1 до n2 на n групп по n чисел в каждой так, чтобы сумма чисел в каждой группе была одна и та же.

У этой задачи пока что нет ответа/решения. Вы можете прислать свой вариант в комментарии.

источник: Запорожская областная олимпиада по информатике, 1997

Комментарии
Google says:
Аноним (18.02.09):
На Яве это выглядит примерно так. Соответственно n можно менять на требуемое число, в данном случае 5.

int n = 5;
int[] allNum = new int[n*n];
int sum = 0;
int sumGr = 0;
int count = 0;

for (int i=1; i<=n*n; i++) {
allNum[i-1] = i;
sum += i;
}
sumGr = sum / n;
System.out.println("Summ of group = " + sumGr);

int tmpSum = 0;
for (int i=n*n-1; i>=0; i--) {
if ( (tmpSum + allNum[i]) <= sumGr) {
tmpSum += allNum[i];
if (allNum[i] != 0) {
System.out.print(allNum[i] + " ");
}
allNum[i] = 0;
}
if (tmpSum == sumGr) {
System.out.println("");
tmpSum = 0;
i = n*n-1;
count++;
if (count == n) {
break;
}
}
}

Вывод будет примерно таким:

Summ of group = 65
25 24 16
23 22 20
21 19 18 7
17 15 14 13 6
12 11 10 9 8 5 4 3 2 1
   Ответ редакции
n групп по n чисел, ага
Vapekreng (27.06.09):
uses crt;
var
a:array[1..10000,1..2] of integer;
i,n:integer;
{---------------------------------------------------------------------------}
procedure chet;
var
j,k:integer;
begin
k:=n*n div 2;
for j:=1 to k do begin
a[j,2]:=((j-1) div (n div 2))+1;
a[n*n-j+1,2]:=a[j,2];
end;
end;
{---------------------------------------------------------------------------}
procedure vivod;
var
j,k:integer;
begin
writeln;
for j:=1 to n do begin
for k:=1 to n*n do
if a[k,2]=j then write(a[k,1],' ');
writeln;
end;
end;
{---------------------------------------------------------------------------}
Procedure nechet;
var
j,k,nom:integer;
begin
for j:=1 to n do a[1+(n+1)*(j-1),2]:=1;
for j:=2 to n do begin
nom:=n+2-j;
for k:=1 to n-1 do begin
a[nom,2]:=j;
if k+1=j then begin
inc(nom);
a[nom,2]:=j;
end;
nom:=nom+n+1;
end;
end;
end;
{---------------------------------------------------------------------------}
begin
clrscr;
write('Vvod n:');
readln(n);
writeln;
writeln(n,' grupp 4isel s summoj v gruppe=',(n*n*n+n) div 2);
for i:=1 to n*n do a[i,1]:=i;
if n mod 2=0 then chet else nechet;
vivod;
readkey;
end.

Действуем так: если n четное, то все просто-берем по n/2 числе с начала и с конца списка-и метим их еденицами. Из оставшихся берем таким же образом 4 числа и метим двойками и.т.д.
Пример при n=4

1 1 2 2 3 3 4 4 4 4 3 3 2 2 1 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

Если n нечетное, то для начала метим еденицами числа 1, 1+(n+1), 1+(n+1)*2 и.т.д до n. Пример для n=5

1 1 1 1 1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
группа 1 группа 2 группа 3 группа 4

Список разбивается на n-1 (в данном случае 4) группу незанятых чисел. Метим их следующим образом: числу, стоящему на 2 месте присваиваем номер n, следующее число с номером n будет стоять на n+1 позицию дальше. Продолжаем подобным образом до конца списка. Кроме того, если номер группы на каком-то шаге будет равен номеру метки+1 (в данном случае для 5 это произойдет на 4-м шаге, когда присвоим метку 5 числу 20), то следующему числу так же присваиваем текущую метку и дальше ведем отсчет от этого числа. Дальше числу под номером 3 присваиваем метку n-1 и действуем аналогично. Продолжаем, пока не выполним алгоритм для метки 2.
Задача готова))
   Ответ редакции
Слишком сложно.
Vapekreng (27.06.09):
Блин, все пробелы убрались... во втором примере читать так:
1___________1_______________1_________________1_________________1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
___группа 1______группа 2__________группа 3__________группа 4
Vapekreng ответил(а) Vapekreng (27.06.09):
Это просто издевательство...Предыдущий пост читать так :)

1___________1_______________1_________________1_________________1
1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25
___группа 1______группа 2__________группа 3__________группа 4
DobermaN (09.10.09):
Мой вариант:

int[,] mas = new int[n, n];
int n1 = n - 1;
for (int i = 0; i < n; i++)
{
int sum = i + 1;
for (int j = 0; j < n; j++)
{
if (j != 0)
{
sum += n + 1;
}
if (i != 0 && j == n1)
{
n1--;
sum -= n;
}
mas[i, j] = sum;
}
}
если mas вывести на экран, то получится
n = 5
1 7 13 19 25 = 65
2 8 14 20 21 = 65
3 9 15 16 22 = 65
4 10 11 17 23 = 65
5 6 12 18 24 = 65
Vapekreng (19.10.09):
Сложно для вас? Программа проста до безобразия, а алгоритм за 10 минут школяры усвоили...
GoldenMan (26.04.10):
program Project3;

{$APPTYPE CONSOLE}

uses
SysUtils;
var
n,k,i,j,l,m:longint;
begin
readln(n);
m:=1;
for i:=1 to n do
begin write(i,' '); m:=i;
for j:=1 to n-1 do
begin
if m mod n = 0 then m:=m+1 else
m:=m+n+1;
write(m, ' ');
end; writeln;
end;
readln;
{ TODO -oUser -cConsole Main : Insert code here }
end.

Моя версия на дельфи
Комментарий от новенького:
Комментарий является ответом:
Новенький является
Новенький не робот
Знаки на картинке: латинские буквы, арабские цифры


Есть на сайте: Онлайн кроссворды Задачи Онлайн игры Блог
Все работы, опубликованные на сайте — авторские, если не указано иное. Перепечатка возможна только с письменного разрешения владельцев ресурса, с обязательной ссылкой на сайт petruchek.info. Пишите нам: . Сайт должен работать в IE, FF, Opera, Safari.

Реклама:

Разработано в студии "Webous"о проектесайта карта

Реклама: