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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.11.2014, 11:27   #1
sidjer
Новичок
Джуниор
 
Регистрация: 28.11.2014
Сообщений: 1
Смущение Трудности с сортировкой

Доброго времени суток. Есть такая интересная задача:
=================================== ==========================
В финал олимпиады по программированию вышло n участников.
Итоги олимпиады подводились по трем критериям:
- скорость написания программ: за одно и то же время участники решили соответственно S[1], S[2], ..., S[n] задач;
- скорость выполнения программ: на выполнение программ участников ушло соответственно T[1], T[2], ..., T[n] минут;
- оригинальность: программы каждого участника получили соответственно M[1], M[2], ..., M[n] баллов.
Считая, что для i-го участника известны S[i], T[i], M[i] распределить их по местам по следующим критериям:
- участник, решивший больше задач занимает лучшее место;
- при равном количестве решенных задач лучшее место занимает участник, чьи задачи выполняются быстрее;
- при равных количестве решенных задач и скорости их выполнения лучшее место достается участнику с большим количеством баллов за оригинальность;
- при одинаковом количестве баллов по каждому из критериев участники разделяют одно место и располагаются в одной строке по алфавиту.
Входные данные
Во входном текстовом файле с именем inp.dat заданы количество участников и имена участников и их результаты. В первой строке указано количество участников. В следующей, второй строке через пробелы задано имя первого участника и его результаты и т.д.
Спецификация ввода
<N>
<Имя1> <S[1]> <T[1]> <M[1]>
<Имя2> <S[2]> <T[2]> <M[2]>
... ... ... ...
<Имяn> <S[n]> <T[n]> <M[n]>
Выходные данные
В выходной текстовый файл с именем out.dat в порядке занятых мест с новой строки вывести места (через тире) и имена участников, занявших данные места (по алфавиту через пробел).
Спецификация вывода
<места> <список имен>
<места> <список имен>
<места> <список имен>
<места> <список имен>
Пример:

Inp.dat
5
Иванов 3 4 1
Петров 3 4 3
Сидоров 5 3 4
Кузнецов 5 2 1
Фролов 3 4 3

out.dat
1 Кузнецов
2 Сидоров
3-4 Петров Фролов
5 Иванов
=================================== ==========================
Реализовал ее частично на основе примера так:
Код:
Type
Sved=record
za:longint;
name:string[30];
time:longint;
score:longint;
end;
Var
T:array[1..10] of sved;
P:array[1..10] of string;
TEMP:array[1..10] of sved;
i,j,k,e,max,h,tt,b,n:longint;
tmp,tmpp:string;
st:boolean;
inp,otp:text;
Begin
assign(inp,'inp.dat');
reset(inp);
readln(inp,k);
 
for i:=1 to k do
 readln(inp,P[i]);
 close(inp);
 
for i:=1 to k do begin
 tmp:=P[i];
  st:=true;
 j:=0;
while st=true do begin
 j:=j+1;
 if tmp[j]=' ' then begin
 T[i].name:=copy(tmp,1,j-1);   //Запись имени
 delete(P[i],1,j);
 st:=false;
      end;
     end;
   end;
 
 for i:=1 to k do begin
 tmp:=P[i];
 st:=true;
 j:=0;
while st=true do begin
 j:=j+1;
 if tmp[j]=' 'then begin
 tmpp:=copy(tmp,1,j-1); 
 Val(tmpp,T[i].za,e);                //Запись кол-ва задач в массив
 delete(P[i],1,j);
 st:=false;
     end;
   end;
 end;
 
for i:=1 to k do begin
 tmp:=P[i];
 st:=true;
 j:=0;
while st=true do begin
 j:=j+1;
 if tmp[j]=' 'then begin
 tmpp:=copy(tmp,1,j-1);
 Val(tmpp,T[i].time,e);      //Запись времени в массив
 delete(P[i],1,j);
 st:=false;
     end;
   end;
 end;
 
 for i:=1 to k do begin
 tmp:=P[i];
 Val(tmp,T[i].score,e);      //Запись баллов оригинальности в массив
 delete(P[i],1,j);
 end;
             n:=k;
 repeat
  tt:=0;
  for j:=1 to n-1 do
  if T[j].za<T[j+1].za
    then
      begin
        TEMP[j]:=T[j];     //сортировка по кол-ву решенных задач
        T[j]:=T[j+1];
        T[j+1]:=TEMP[j];
        tt:=j
        end;
  n:=tt;
  until tt=0;
 
  for i:=1 to k do begin  //временный вывод
  writeln;
  write(i,' ',T[i].name,' ');
  write(T[i].za,' ');
  write(T[i].time,' ');
  write(T[i].score,' ');
end;
 
 readln;
 
END.
Проблема в том, что не знаю как реализовать сортировку по нескольким критериям, т.е по задаче: "- участник, решивший больше задач занимает лучшее место;
- при равном количестве решенных задач лучшее место занимает участник, чьи задачи выполняются быстрее;
- при равных количестве решенных задач и скорости их выполнения лучшее место достается участнику с большим количеством баллов за оригинальность;
- при одинаковом количестве баллов по каждому из критериев участники разделяют одно место и располагаются в одной строке по алфавиту."

Уже несколько дней ломаю голову, помогите чем сможете, спасибо!
sidjer вне форума Ответить с цитированием
Старый 28.11.2014, 11:50   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Делфийский пример простейшей сортировки массива записей по нескольким полям. Приспосабливай
Код:
type TMyRecord = record a1,a2,a3: Integer; end;
var xData: array of TMyRecord;
    xTemp: TMyRecord;
    i,j: Integer;
...
  for i:=Low(xData) to High(xData)-1 do
    for j:=i+1 to High(xData) do
      if (xData[i].a1>xData[j].a1) or
         ((xData[i].a1=xData[j].a1) and (xData[i].a2>xData[j].a2)) or
         ((xData[i].a1=xData[j].a1) and (xData[i].a2=xData[j].a2) and (xData[i].a3>xData[j].a3)) then begin
        xTemp:=xData[i];
        xData[i]:=xData[j];
        xData[j]:=xTemp;
      end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 28.11.2014 в 11:53.
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Трудности c JPanel Aerowalk Общие вопросы по Java, Java SE, Kotlin 1 20.09.2014 21:30
C# и Java трудности. LaiQue Общие вопросы .NET 0 24.04.2010 15:50
Трудности перевода Elidan Общие вопросы C/C++ 0 10.06.2009 01:49
Трудности с формулой arr1val Microsoft Office Excel 1 15.08.2008 17:18
Трудности перевода Maks1978 Свободное общение 6 30.05.2008 12:55