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

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

26.11.2010, 21:02. Просмотров 835. Ответов 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
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Олимпиадна.... Сложная (Pascal):

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

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

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

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

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

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

10
nonamez123
186 / 182 / 54
Регистрация: 23.10.2010
Сообщений: 1,329
26.11.2010, 21:12 #2
Цитата Сообщение от DsinaG Посмотреть сообщение
Добавлено через 12 минут
ПОМОГИТЕ ПОЖАЛУЙСТА , по зарез хочеться понять смысыл и решение задачи...... ПОЖАЛУЙСТА!!!!!!!
если хочется понять смысл, то вот http://www.cyberforum.ru/pascal/thread133142.html , мне оно помогло очень понять смысл.

Вот я вчера имел задание, там нужно было список 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 Посмотреть сообщение
если хочется понять смысл, то вот http://www.cyberforum.ru/pascal/thread133142.html , мне оно помогло очень понять смысл.

Вот я вчера имел задание, там нужно было список 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
186 / 182 / 54
Регистрация: 23.10.2010
Сообщений: 1,329
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
186 / 182 / 54
Регистрация: 23.10.2010
Сообщений: 1,329
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
186 / 182 / 54
Регистрация: 23.10.2010
Сообщений: 1,329
26.11.2010, 22:01 #10
я даже знаю чём ошибка, нужно вместо i использовать отдельную переменную, и после врайта её увеличиватьс на определённое кол-во едениц, так как sk[i+1] 2, а при втором выполнение цикла sk[i] тоже 2, по этому 1,2,1/1,2,2/2, просто дублируется
0
Mawrat
12821 / 5729 / 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
Привет! Вот еще темы с решениями:

Сложная задача(для меня во вском случае).
На паскаль. Через множества. Даны следующие описания переменных: type...

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

Сложная Переделка на тему "Файлы. Начало есть.
Доброго вам время суток! В условиях задачи 18 выяснить, имеется ли пассажир,...

сложная задачка
В программе создать одиночные объекты и массив объектов класса и вызвать...


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

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

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