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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.04.2009, 01:01   #1
Juliya_U
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 20
По умолчанию Не простая, но очень интересная задача (Pascal)!

Задание:
Хотите посоревноваться в ACM ICPC? Тогда вам нужно знать, как вести счет!
Участники соревнований ранжируются сначала по числу решенных задач (чем
больше, тем лучше), а потом по уменьшению величины штрафного времени. Если
у двух и более участников совпадает и количество решенных задач, и величина
штрафного времени, то они отображаются в порядке увеличения номеров команд.
Задача засчитывается решенной участником соревнований, если любая из
попыток отправки этой задачи была признана верной. Штрафное время рассчиты-
вается как число минут, прошедших до того, как было отправлено правильное
решение, плюс 20 минут за каждую некорректную отправку, имевшую место до
верного решения. За нерешенные задачи штрафное время не начисляется.

Входные данные
Входные данные начинаются со строки, содержащей одно целое положительное
число, задающее число блоков, которые описаны ниже. За этой строкой следует пус-
тая. Также пустая строка находится между двумя последовательными блоками.
Входные данные состоят из судейского списка очередности, содержащего вхожде-
ния по нескольким или по всем участникам соревнований с 1-го по 100-й, решающим
задачи с 1-й по 9-ю. Каждая строка входных данных состоит из трех чисел и буквы
в формате участник задача время L, где L может быть С, I, R, U или Е. Это означа-
ет: Correct (верно), Incorrect (неверно), Clarification Request (уточняющий запрос),
Unjudged (необработан) и Erroneous submission (отправка с ошибкой). Последние три
случая не влияют на счет.
Строки входных данных идут в том порядке, в котором получались посылки.

Выходные данные
Выходные данные для каждого блока должны представлять собой табло,
отсортированное по критериям, описанным выше. Каждая строка выходных данных
должна содержать номер участника, количество задач, решенных участником,
и полное штрафное время, полученное участником. Так как не все участники в дейст-
вительности соревнуются, отображайте только тех участников, кто посылал решения.
Между выходными данными для двух последовательных блоков должна быть
пустая строка.
Пример входных данных
1

1 2 10 I
3 1 11 С
1 2 19 R
1 2 21 С
1 1 25 С

Соответствующие выходные данные
1 2 66
3 1 11
Juliya_U вне форума Ответить с цитированием
Старый 07.04.2009, 05:54   #2
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

вот. вроде правильно:
Код:
const SortByZad=true;
      SortByTime=false;

type Uch=record
     Num:byte;
     Time:longint;
     ZadCount:byte;
     Zad:array[1..9] of boolean;
     enabled:boolean;
end;

var ar:array[1..100] of Uch;
    count:byte;

procedure swap(i1,i2:byte);
var tempUch:Uch;
begin
 tempUch:=ar[i1];
 ar[i1]:=ar[i2];
 ar[i2]:=tempUch;
end;

procedure inputProc;
var i,j:byte;
    num,time,temp,zad:byte;
    ch:char;
    inp:text;
begin
 assign(inp,'input.txt');
 reset(inp);
 read(inp,temp);
 count:=0;
 while not eof(inp) do
  begin
   read(inp,num,zad,time);
   read(inp,ch);
   read(inp,ch);
   if not ar[num].enabled then
    begin
     inc(count);
     ar[num].enabled:=true;
     ar[num].Num:=num;
    end;
   if (ch='C') and (not ar[num].Zad[zad]) then
    begin
     ar[num].Zad[zad]:=true;
     inc(ar[num].Time,time);
     inc(ar[num].ZadCount);
    end;
   if (ch='I') and (not ar[num].Zad[zad]) then
    inc(ar[num].Time,20);
  end;
  close(inp);
end;

procedure outputProc;
var i:byte;
    outp:text;
begin
 assign(outp,'output.txt');
 rewrite(outp);
 for i:=1 to count do
  writeln(outp,ar[i].Num,' ',ar[i].ZadCount,' ',ar[i].Time);
 close(outp);
end;

procedure normalize;
var i,n:byte;
begin
 n:=1;
 i:=1;
 while n<=Count do
  begin
   if ar[i].enabled then
    begin
     swap(i,n);
     inc(n);
    end;
   inc(i);
  end;
end;

procedure sortInterval(i1,i2:byte;SortParam:boolean);
var i,j:byte;
    b:boolean;
begin
 b:=true;
 while b do
  begin
   b:=false;
   for i:=i1 to i2-1 do
    if ((ar[i].ZadCount<ar[i+1].ZadCount) and (SortParam=SortByZad)) or ((ar[i].Time>ar[i+1].Time) and (SortParam=SortByTime)) then
     begin
      swap(i,i+1);
      b:=true;
     end;
  end;
end;

procedure podSort;
var i,beg:byte;
    temp:byte;
    b:boolean;
begin
 temp:=ar[1].ZadCount;
 beg:=1;
 b:=false;
 for i:=2 to Count do
  if ar[i].ZadCount=temp then
   b:=true
  else
   begin
    if b then sortInterval(beg,i-1,SortByTime);
    b:=false;
    beg:=i;
    temp:=ar[i].ZadCount;
   end;
 if b then sortInterval(beg,Count,SortByTime);
end;

procedure sort;
begin
 normalize;
 sortInterval(1,Count,SortByZad);
 podSort;
end;

begin
     inputProc;
     sort;
     outputProc;
end.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.04.2009, 19:18   #3
Juliya_U
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 20
По умолчанию Не простая, но очень интересная задача (Pascal)!

Min, большое спасибо за такую скорую помощь, но у меня что-то не получилось из входных данных (из примера) получить соответствующие выходные. Я получила:
3 0 0
1 0 20
А у тебя как, получилось?

Последний раз редактировалось Juliya_U; 07.04.2009 в 19:38.
Juliya_U вне форума Ответить с цитированием
Старый 07.04.2009, 20:03   #4
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

Вы во входных данных "C" русскую написали, а надо английскую.))))))
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.04.2009, 20:20   #5
Juliya_U
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 20
По умолчанию Не простая, но очень интересная задача (Pascal)!

Точно, спасибо, это я копипастила, чтоб не ошибиться) А можно еще вопрс: не могу понять зачем в процедуре swap переприсваиваются элементы.
Juliya_U вне форума Ответить с цитированием
Старый 07.04.2009, 20:44   #6
Juliya_U
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 20
По умолчанию

И еще)) мне просто необходимо данные вводить не с файла, а с клавиатуры, а для этого я так понимаю нужен динамический массив, т.к. я не могу заранее определить кол-во вводимых строк. Подскажите пожалуйста как это правильно сделать.
Juliya_U вне форума Ответить с цитированием
Старый 07.04.2009, 20:59   #7
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

swap - это процедура обмена местами 2х элементов массива. нужна для сортировки.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.04.2009, 21:13   #8
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

да разницы впринципе нет, за исключением тогдо что ситывать придется String'у а потом уже переводить её в нужные величины. А динамический массив нужен в том случае, если колличество входных данных просто не умещается в максимальный размер массива. А если это так, то и из файла нужно в динамический массив будет считывать. А работа с дин. массивом - это куча заморочек. все переписывать придется и скорость выполнения упадет прилично.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.04.2009, 21:14   #9
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

В ващем случае дин. массив не нужен, т.к. участников только 100
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 07.04.2009, 21:20   #10
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

ааааа......... перечитал задачу внимательнее)))))
Инфу оказыца поблочно нужно выводить)))) а я всё в кучу сделал))))
ну моё решение подправить несложно....
А вот если с клавы вводить, то тут уж данных нехватает. А именно максимального колличества блоков.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Очень интересная задача на Pascal !!! Советую посмотреть!!! d00ker Помощь студентам 5 14.01.2009 19:46
Интересная задача в Pascal cuzo Помощь студентам 9 28.12.2008 17:50