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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.06.2014, 13:58   #1
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
Радость Сортировки (TurboPascal)

Урок физкультуры

На уроке физкультуры учителю надо расставить учеников в порядке возрастания роста. Если
их рост равен, то вперёд становится ученик, сила которого больше. Помогите ему расставить
учеников.
Гарантируется, что сила у всех учеников разная.
Формат ввода:
n количество учеников (0<n<151)
a1 b1 ai bi - рост и сила i ученика соответственно (0<ai, bi<1000001)
a2 b2

an bn
Формат вывода: выведите рост и силу каждого ученика после расстановки.

lesson.in
4
4 3
1 2
7 8
5 6

lesson.out
1 2
4 3
5 6
7 8

Вот мои наработки:

Код:
var
 n,i,j,r,k,z: longint;
 a,b: array [0..151] of longint;
begin
 assign(input,'lesson.in');
 reset(input);
 assign(output,'lesson.out');
 rewrite(output);

 read(n);
 for i:=1 to n do read(a[i],b[i]);

 for i:=1 to n-1 do
 begin
  for j:=i+1 to n do if a[j]<a[i] then
  begin
   z:=a[i];
   a[i]:=a[j];
   a[j]:=z;
   z:=b[i];
   b[i]:=b[j];
   b[j]:=z;
  end;
 end;
 z:=1;
 for i:=1 to n do
 begin
  for j:=1 to n do
  if a[i] = a[i+1] then inc(z) else break;
  for j:=i to z do for r:=j+1 to z do if b[r]>b[j] then
  begin
   k:=b[j];
   b[j]:=b[r];
   b[r]:=k;
  end;
  z:=1;
 end;
 for i:=1 to n do writeln(a[i],' ',b[i]);
end.
Не проходит 4 тест:
И зарание спасибо всем кто хоть как-нибудь поможет!


Задачу решил!

вот:

Код:
var
 n,i,j,r,k,z: longint;
 a,b: array [0..151] of longint;
begin
 assign(input,'lesson.in');
 reset(input);
 assign(output,'lesson.out');
 rewrite(output);

 read(n);
 for i:=1 to n do read(a[i],b[i]);

 for i:=1 to n-1 do
 begin
  for j:=i+1 to n do
  if (a[i] > a[j]) or ((a[i] = a[j]) and
  (b[i] < b[j])) then
  begin
   z:= a[i];
   a[i]:= a[j];
   a[j]:= z;
   z:=b[i];
   b[i]:=b[j];
   b[j]:=z;
  end;
 end;
 for i:=1 to n do writeln(a[i],' ',b[i]);
end.
Большое спасибо BDA и Xaker_Two за помощь в решении!
Вложения
Тип файла: txt input.txt (1.1 Кб, 155 просмотров)
Тип файла: txt output.txt (1.1 Кб, 140 просмотров)

Последний раз редактировалось VladKB1; 09.06.2014 в 17:38.
VladKB1 вне форума Ответить с цитированием
Старый 09.06.2014, 15:11   #2
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

Знаешь как можно сделать - домножить рост на 10 или 100 приплюсовать к нему силу получим двузначное - трехзначное число далее сортируем методом "пузыря" конечно метод не самый оптимизированный очень объемный но для данной задачи покатит через пару минут если надо настрочу код)
Xaker_Two вне форума Ответить с цитированием
Старый 09.06.2014, 15:22   #3
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Xaker_Two Посмотреть сообщение
Знаешь как можно сделать - домножить рост на 10 или 100 приплюсовать к нему силу получим двузначное - трехзначное число далее сортируем методом "пузыря" конечно метод не самый оптимизированный очень объемный но для данной задачи покатит через пару минут если надо настрочу код)
Ну ок. Я это могу сделать , но а как выводить сила привязана к росту она должна переходить вместе с ним! Мне лудше всего что бы мой код исправили и что бы он работал! Но всёровно спасибо за совет !
VladKB1 вне форума Ответить с цитированием
Старый 09.06.2014, 15:28   #4
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
По умолчанию

Цитата:
Сообщение от VladKB1 Посмотреть сообщение
Ну ок. Я это могу сделать , но а как выводить сила привязана к росту она должна переходить вместе с ним!
А в чем проблема просто читаешь файл удлиняешь массив пока не прочтешь его весь и пишешь в этот массив перемноженные на 10/100/1000 и плюсованые числа затем упорядочиваешь и при записи просто используешь div и mod чтоб их снова расцепить и пишешь в файл

с вашим кодом попробую поковыряться но я так сказать тоже не профи

Цитата:
Сообщение от VladKB1 Посмотреть сообщение
[CENTER]
Не проходит 4 тест:
не совсем понял что за тесты
Xaker_Two вне форума Ответить с цитированием
Старый 09.06.2014, 15:32   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Используйте для хранения записи:
Код:
type
  pupil = record
    growth, force: longint;
  end;

var
  a: array [1..150] of pupil;
А сортировка (не проверял):
Код:
for i := 1 to n - 1 do
  for j := i + 1 to n do
    if (a[i].growth > a[j].growth) or ((a[i].growth = a[j].growth) and (a[i].force < a[j].force)) then
    begin
      b := a[i];
      a[i] := a[j];
      a[j] := b;
    end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.06.2014 в 15:45.
BDA вне форума Ответить с цитированием
Старый 09.06.2014, 16:04   #6
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Xaker_Two Посмотреть сообщение
А в чем проблема просто читаешь файл удлиняешь массив пока не прочтешь его весь и пишешь в этот массив перемноженные на 10/100/1000 и плюсованые числа затем упорядочиваешь и при записи просто используешь div и mod чтоб их снова расцепить и пишешь в файл

с вашим кодом попробую поковыряться но я так сказать тоже не профи



не совсем понял что за тесты
Xaker_Two , я скинул во вложениях тест он не проходит
VladKB1 вне форума Ответить с цитированием
Старый 09.06.2014, 16:07   #7
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Цитата:
type
pupil = record
токого ещё не знаю и использовать не могу ((
VladKB1 вне форума Ответить с цитированием
Старый 09.06.2014, 16:12   #8
Xaker_Two
Пользователь
 
Регистрация: 03.02.2013
Сообщений: 73
Смех

вот накодил по быстренькому уж извините что не ваш код юзал но вот

Код:
var
Inpt, Outpt: TextFile;
Rst, Stn: Array of Integer;
Temp1, Temp2: String;
Change: Boolean;
i, Temp3: Integer;
begin
AssignFile(Inpt, 'lesson.in');
AssignFile(Outpt, 'lesson.out');
Reset(Inpt);
Rewrite(Outpt);
while not EOF(Inpt) do
  begin
  SetLength(Rst, Length(Rst)+1);
  SetLength(Stn, Length(Stn)+1);
  Readln(Inpt, Temp1);
  Temp2:=Copy(Temp1, pos(' ', Temp1)+1, 3);
  Delete(Temp1, pos(' ', Temp1), Length(Temp1));
  Rst[Length(Rst)-1]:=StrToInt(Temp1);
  Stn[Length(Stn)-1]:=StrToInt(Temp2);
  end;
Change:=True;
i:=0;
while Change=True do
  begin
  Change:=False;
  for i:=0 to Length(Rst)-2 do
    if Rst[i]>Rst[i+1] then
      begin
      Temp3:=Rst[i];
      Rst[i]:=Rst[i+1];
      Rst[i+1]:=Temp3;
      
      Temp3:=Stn[i];
      Stn[i]:=Stn[i+1];
      Stn[i+1]:=Temp3;
      
      Change:=True;
      end
     else if (Rst[i]=Rst[i+1]) and (Stn[i]<Stn[i+1]) then
        begin
        Temp3:=Rst[i];
        Rst[i]:=Rst[i+1];
        Rst[i+1]:=Temp3;
      
        Temp3:=Stn[i];
        Stn[i]:=Stn[i+1];
        Stn[i+1]:=Temp3;
      
        Change:=True;
        end;
  end;
for i:=0 to Length(Rst)-1 do
  Writeln(Outpt, IntToStr(Rst[i]) + ' ' + IntToStr(Stn[i]));
CloseFile(Inpt);
CloseFile(Outpt);

end.
тестилось при следующем содержимом Input-а
7 4
7 5
8 2
3 6

на выходе имели

3 6
7 5
7 4
8 2


если сделать как я предлагал то он сортировать будет однако он что по силе что росту ставит по возрастанию

кстати выход с вашего input-а который как я понял и есть тест следующий(приготовьтесь читать) и да такой вопросец а где вы видели человека с ростом 2.532 КМ?? )

1 958
1 913
1 879
1 868
1 837
1 821
1 756
1 686
1 678
1 638
1 547
1 348
1 345
1 311
1 255
1 175
1 170
1 149
1 129
1 111
1 104
1 38
2 987
2 967
2 855
2 817
2 797
2 636
2 574
2 526
2 514
2 420
2 240
2 238
2 202
2 200
2 198
2 123
2 82
2 77
2 59
2 0
3 648
3 543
3 443
3 417
3 218
3 28
4 773
4 684
4 598
4 344
4 40
5 917
5 841
5 586
5 391
5 365
5 146
5 19
6 757
6 556
6 289
7 670
7 608
7 585
7 316
7 245
8 647
8 401
12 528
12 455
12 314
12 212
12 122
12 12
23 425
23 321
23 29
24 903
24 840
24 820
24 712
24 630
24 540
24 351
24 109
24 86
25 959
25 762
25 704
25 632
25 613
25 596
25 515
25 458
25 357
25 196
25 125
25 44
34 896
34 789
36 710
36 355
36 64
43 852
43 188
43 179
46 914
46 887
46 61
52 861
52 633
52 160
53 888
53 448
53 152
65 897
65 737
65 712
131 848
131 663
131 477
134 544
134 478
134 1
136 901
136 877
136 522
235 990
235 354
235 337
235 206
235 178
235 87
345 662
345 412
345 375
346 510
346 480
346 296
424 946
424 481
424 331
758 935
758 693
758 192
2532 912
2532 487
2532 447

Последний раз редактировалось Xaker_Two; 09.06.2014 в 16:15.
Xaker_Two вне форума Ответить с цитированием
Старый 09.06.2014, 16:15   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

VladKB1, не можете использовать, потому что не знаете? Так изучите - дело пары минут. Вот прочтите http://www.pascal.helpov.net/index/p...rd_programming.

Xaker_Two, ну любят писать условия почеловечнее. А по сути имеются пары чисел, которые должны быть отсортированы в порядке возрастания первого числа из пары, а при равенстве первого, по убыванию второго.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.06.2014 в 16:27.
BDA вне форума Ответить с цитированием
Старый 09.06.2014, 16:57   #10
VladKB1
Форумчанин
 
Регистрация: 21.05.2014
Сообщений: 121
По умолчанию

Я занимаюсь программированием по своей воле. В нашем городе есть КЮП-клуб юных пожарных. В нём я учусь программировать по "программе обучения" сейчас я на теме Сортировка выбором,пузырьком и порошутиком. Вот и эту задачу нужно решить этим способом. Tип переменных string использовать ещё нельзя (он выше по теме). но всё же спасибо за свои идеи и решения, но мне нужно решение куда более проще. Самое бы лудше было бы исправить, дополнить моё решение.

Код:
SetLength(Rst, Length(Rst)+1);
  SetLength(Stn, Length(Stn)+1);
  Readln(Inpt, Temp1);
  Temp2:=Copy(Temp1, pos(' ', Temp1)+1, 3);
  Delete(Temp1, pos(' ', Temp1), Length(Temp1));
  Rst[Length(Rst)-1]:=StrToInt(Temp1);
  Stn[Length(Stn)-1]:=StrToInt(Temp2);
токого и подавно не изучал;

Цитата:
и да такой вопросец а где вы видели человека с ростом 2.532 КМ??
эти тесты придумывал не я! они были придуманы автором задачи , а моя программа его не прошла!

Но всё же спасибо за старание и проявления помощи очень благодарен, но всё же такой код использовать не буду .


Цитата:
VladKB1, не можете использовать, потому что не знаете? Так изучите
Не могу изучать пока не переберусь по теме выше!

Но вам тоже спасибо за проявление помощи! Спасибо .

Последний раз редактировалось VladKB1; 09.06.2014 в 16:59.
VladKB1 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа, сортирующая исходный одномерный массив целых чисел методами пузырьковой сортировки и сортировки прямым выбором (язык С) igor01 Помощь студентам 7 16.05.2014 23:21
Сравнить эффективность алгоритмов шейкерной сортировки и сортировки слиянием (язык C) Ольга210993 Помощь студентам 2 20.09.2012 13:52
Алгоритмы сортировки пирамидальный(кучей) и быстрой сортировки (с++) mmd12 Помощь студентам 4 17.05.2012 14:14
turboPascal masterlomaster Помощь студентам 1 26.04.2011 19:45