Форум программистов, компьютерный форум, киберфорум
Наши страницы
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
DsinaG
5 / 5 / 3
Регистрация: 13.11.2010
Сообщений: 32
1

Олимпиадна.... Сложная

26.11.2010, 21:02. Просмотров 848. Ответов 10
Метки нет (Все метки)

В чемпионате по программированию учавствуют N(2<=N<=100) странб каждая из которых выставила некоторое количество участников. Для проведения чемпионата каждому участнику предоставляется отдельный компьютерю Все компьютеры расставлены в один ряд, так что у каждого участника(кроме крайних), окажеться по два соседа. Решено было, что участники из одной страны не могут сидеть за соседними компьютерами, чтобы они не могли помогать друг другу. Требуеться найти какой-нибудь способ
рассадки участников, удовлетворяющий данным требованиям.

Входные данные:
В первой строке содержиться N -количество стран, выставивших участников на чемпионат. Во второй строке содержится N записанных через пробел целых чисел- колисества участников из первой , второй,... N-ой страны соответственно.

Выходные данные:
В выходной файл вывести любой вариант рассадки участников, удовлетворяющий заданным требованиям с следующем виде: для каждого участника записать номер его страны, разделяя номера одним пробелом.

Замечания:
1) Гарантируется, что при заданных входных данных хотя бы один вариант рассадки существует.
2) Гарантируется, что общее число участников из всех стран не больше 100.


ПРОШУ ПОМОЩИ, НЕ МОГУ САМ РЕШИТЬ ДАже нет идей её решения.... САМА СЛожноя задача у нас на олимпиаде..........

Добавлено через 12 минут
ПОМОГИТЕ ПОЖАЛУЙСТА , по зарез хочеться понять смысыл и решение задачи...... ПОЖАЛУЙСТА!!!!!!!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2010, 21:02
Ответы с готовыми решениями:

Сложная задачка
Всем привет ещё раз:) Помогите решить задачку.. Просто я пыталась найти какие нибудь решения, но не...

Сложная формула
Помогите пожалуйста написать формулу на паскале... ...

сложная функция
Молю о помощи!:wall: Вычислить значение функции

Задача не сложная на тему строки.
Создайте программу, которая запрашивает тестовую строку и заменяет все слоги &quot;ра&quot; на &quot;пар&quot;....

сложная функция с графическим режимом
просьба помочь в решении данной программы(см вложение) буду очень признателен...

10
nonamez123
187 / 183 / 54
Регистрация: 23.10.2010
Сообщений: 1,331
26.11.2010, 21:12 2
Цитата Сообщение от DsinaG Посмотреть сообщение
Добавлено через 12 минут
ПОМОГИТЕ ПОЖАЛУЙСТА , по зарез хочеться понять смысыл и решение задачи...... ПОЖАЛУЙСТА!!!!!!!
если хочется понять смысл, то вот Стандартные операции с массивами (матрицами) , мне оно помогло очень понять смысл.

Вот я вчера имел задание, там нужно было список 1,2,3,4,5,6,7,8,9,10 умножить 1*10+2*9+3*8+4*7+5*6.

Если учесть что ученики идут парами 1,2/3,4/5,6..., то она тебе вполне поможет.
Pascal
1
2
3
4
5
6
    
for i:= 1 to n do
begin
inc(j);
y:=y+x[i]*x[c-j];
end;
1
DsinaG
5 / 5 / 3
Регистрация: 13.11.2010
Сообщений: 32
26.11.2010, 21:17  [ТС] 3
Цитата Сообщение от nonamez123 Посмотреть сообщение
если хочется понять смысл, то вот Стандартные операции с массивами (матрицами) , мне оно помогло очень понять смысл.

Вот я вчера имел задание, там нужно было список 1,2,3,4,5,6,7,8,9,10 умножить 1*10+2*9+3*8+4*7+5*6.

Если учесть что ученики идут парами 1,2/3,4/5,6..., то она тебе вполне поможет.
Pascal
1
2
3
4
5
6
    
for i:= 1 to n do
begin
inc(j);
y:=y+x[i]*x[c-j];
end;
Спасибо.. ПОГЛЯЖУ ПОПРОБУЮ РАзобраться...... СПАСИБ.
0
nonamez123
187 / 183 / 54
Регистрация: 23.10.2010
Сообщений: 1,331
26.11.2010, 21:18 4
щас я попробую написать тоже, если мозг не закипит
0
DsinaG
5 / 5 / 3
Регистрация: 13.11.2010
Сообщений: 32
26.11.2010, 21:28  [ТС] 5
Цитата Сообщение от nonamez123 Посмотреть сообщение
щас я попробую написать тоже, если мозг не закипит
скиньте будте добры исходник..... я как бы вроде и получаться и в то же время нет......
0
ChameleoN
ТруЪ Одмин Всiя Руси
67 / 67 / 14
Регистрация: 20.11.2010
Сообщений: 288
26.11.2010, 21:30 6
Если за тебя всегда будут делать другие, то и не будет получаться никогда, ибо в практике совершенство
0
DsinaG
5 / 5 / 3
Регистрация: 13.11.2010
Сообщений: 32
26.11.2010, 21:36  [ТС] 7
Цитата Сообщение от ChameleoN Посмотреть сообщение
Если за тебя всегда будут делать другие, то и не будет получаться никогда, ибо в практике совершенство
ЯСно по тиху сам разберусь... Я Эт понимаю... Ну уже вторые сутки на дней сижу......
0
nonamez123
187 / 183 / 54
Регистрация: 23.10.2010
Сообщений: 1,331
26.11.2010, 21:48 8
Цитата Сообщение от DsinaG Посмотреть сообщение
скиньте будте добры исходник..... я как бы вроде и получаться и в то же время нет......
Pascal
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
26
27
28
29
program test;
const n=100;
 
   var
      i,j,a,c : integer;
      sk: array [1..n] of integer;
 
begin
c:=30;
j:=0;
a:=1;
{ заполняем массив ерундой}
   for i := 1 to 30 do
   begin
      inc(j);
 
   sk[j]:=a;
   inc(j);
   sk[j]:=a;
   inc(a);
   end;
   
j:=0;
for i:= 1 to 29 do
begin
inc(j);
write(sk[i]{первое число},',',sk[c-j]{последнее число});
end;
end.
вот на выходе получается такое http://gyazo.com/4f6f90e10c40561a608907933563fe0e.png , массив правильно нужно заполнить по идее и вывести , ибо у меня выводит крайнее по убыванию к центру, а у тебя заполняется парами. Ток дошло, попробую исправить.

Добавлено через 9 минут
1,2,11,2,22,3,22,3,33,4,33,4,44,5,44,5,55,6,55,6,66,7,66,7,77,8,77,8,88,9,88,9,99,10,99,10,1010,11,1010,11,1111,12,1111,12,1212,13,1212,13,1313,14,1 313,14,1414,15,1414,15,1515,16,15
вот уже вырисовывается последовательность через 1
Pascal
1
2
for i:= 1 to 29 do
write(sk[i],',',sk[i+2],',',sk[i+1]);
дальше уже сам думай
0
DsinaG
5 / 5 / 3
Регистрация: 13.11.2010
Сообщений: 32
26.11.2010, 21:57  [ТС] 9
Цитата Сообщение от nonamez123 Посмотреть сообщение
Pascal
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
26
27
28
29
program test;
const n=100;
 
   var
      i,j,a,c : integer;
      sk: array [1..n] of integer;
 
begin
c:=30;
j:=0;
a:=1;
{ заполняем массив ерундой}
   for i := 1 to 30 do
   begin
      inc(j);
 
   sk[j]:=a;
   inc(j);
   sk[j]:=a;
   inc(a);
   end;
   
j:=0;
for i:= 1 to 29 do
begin
inc(j);
write(sk[i]{первое число},',',sk[c-j]{последнее число});
end;
end.
вот на выходе получается такое http://gyazo.com/4f6f90e10c40561a608907933563fe0e.png , массив правильно нужно заполнить по идее и вывести , ибо у меня выводит крайнее по убыванию к центру, а у тебя заполняется парами. Ток дошло, попробую исправить.

Добавлено через 9 минут


вот уже вырисовывается последовательность через 1
Pascal
1
2
for i:= 1 to 29 do
write(sk[i],',',sk[i+2],',',sk[i+1]);
дальше уже сам думай
Спасибо дальше уже проще.... ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ!!!!!!!
0
nonamez123
187 / 183 / 54
Регистрация: 23.10.2010
Сообщений: 1,331
26.11.2010, 22:01 10
я даже знаю чём ошибка, нужно вместо i использовать отдельную переменную, и после врайта её увеличиватьс на определённое кол-во едениц, так как sk[i+1] 2, а при втором выполнение цикла sk[i] тоже 2, по этому 1,2,1/1,2,2/2, просто дублируется
0
Mawrat
12827 / 5735 / 1700
Регистрация: 19.09.2009
Сообщений: 8,807
27.11.2010, 03:57 11
Я попробовал решать из таких соображений. Для того, чтобы расположить N элементов массива в любом желаемом порядке требуется не более (N - 1) итераций. Каждая такая итерация состоит из (N - 1) перестановок. Будем переставлять те элементы, положение которых не удовлетворяет условию задачи. Т. е., мы можем выполнять поэлементный перебор массива и выполнять проверки для троек элементов. Если элемент, расположенный в середине тройки имеет хотябы одного соседа из той же страны, что и он, тогда эта ситуация нас не устраивает, и мы выполним перестановку левой пары тройки или правой пары. Причём, например, при перестановках правой пары, по мере прохода массива, в правой части массива может сгруппироваться несколько участников из одной и той же страны. Такое обстоятельство можно назвать выгон вправо. Аналогично при перестановках левой пары в тройке произойдёт выгон влево. Поэтому следует сначала прогнать перестановки, например, по правой паре троек, а затем - по левой. Т. к. максимальное необходимое количество итераций равно N - 1, то можно по выгону вправо и влево прогнать по (N div 2) итераций. По идее, в этом случае мы должны получить желаемый результат.
Реализация этого алгоритма:
Pascal
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
program Project1;
 
const
  //Максимальное количество участвующих стран.
  M = 10;
  //количество участников от одной страны.
  N = 5;
type
  TMemb = record
    Num : Integer;
    Country : String[15];
  end;
  TArr = array[1..M * N] of TMemb;
var
  Arr : TArr;
  i, j, k, Len, M1 : Integer;
  Memb : TMemb;
  S : String;
begin
  //Заполнение массива участников.
  Randomize;
  M1 := 5 + Random(M + 1 - 5);
  k := 0;
  for i := 1 to M1 do begin
    Str(i, S);
    S := 'Стр' + S;
    Write(S, ':', #9);
    for j := 1 to N do begin
      k := k + 1;
      Arr[k].Num := j;
      Arr[k].Country := S;
      if j > 1 then Write(#9);
      Write(j);
    end;
    Writeln;
  end;
 
  //Расстановка с выгоном вправо.
  Len := M1 * N;
  for i := 1 to Len div 2 do begin
    for j := 1 + 1 to Len - 1 do begin
      if
        not (
          (Arr[j - 1].Country <> Arr[j].Country)
          and (Arr[j + 1].Country <> Arr[j].Country)
        )
      then begin
        Memb := Arr[j];
        Arr[j] := Arr[j + 1];
        Arr[j + 1] := Memb;
      end;
    end;
  end;
  //Расстановка с выгоном влево.
  for i := 1 to Len div 2 do begin
    for j := 1 + 1 to Len - 1 do begin
      if
        not (
          (Arr[j - 1].Country <> Arr[j].Country)
          and (Arr[j + 1].Country <> Arr[j].Country)
        )
      then begin
        Memb := Arr[j];
        Arr[j] := Arr[j - 1];
        Arr[j - 1] := Memb;
      end;
    end;
  end;
 
  //Распечатка результата.
  Writeln('После расстановки:');
  k := 0;
  for i := 1 to M1 do begin
    for j := 1 to N do begin
      k := k + 1;
      if j > 1 then Write(#9);
      Write(Arr[k].Country, '(', Arr[k].Num, ')');
    end;
    Writeln;
  end;
 
  Readln;
end.
Судя по результатам, задача оказалась решённой.
1
27.11.2010, 03:57
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2010, 03:57

Циклы программа не сложная ПОМ*ОГИТЕ.
Написать программу ,которая загадывает случайное числа из 100.Пользователю предлагается отгодать...

Сложная задача(для меня во вском случае).
На паскаль. Через множества. Даны следующие описания переменных: type город=(a,b,c,d,e,f,g,h); ...

Непонятная/странная/сложная/интересная на двумерные массивы.
В данном двумерном массиве целого типа посчитать количество нечетных элементов, находящихся в её...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru