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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2009, 01:03   #21
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;

type Block=record
     ar:array[1..100] of Uch;
     count:byte;
     next:^Block;
end;

var firstBlock,curBlock:^Block;
    BlockCount:integer;

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

procedure AddState(num,zad:integer;time:longint;ch:char);
begin
 if not CurBlock^.ar[num].enabled then
  begin
   inc(CurBlock^.count);
   CurBlock^.ar[num].enabled:=true;
   CurBlock^.ar[num].Num:=num;
  end;
 if (ch='C') and (not CurBlock^.ar[num].Zad[zad]) then
  begin
   CurBlock^.ar[num].Zad[zad]:=true;
   inc(CurBlock^.ar[num].Time,time);
   inc(CurBlock^.ar[num].ZadCount);
  end;
 if (ch='I') and (not CurBlock^.ar[num].Zad[zad]) then
  inc(CurBlock^.ar[num].Time,20);
end;

procedure inputProc;
var i,j,iBlock:byte;
    num,temp,zad,c:integer;
    time:longint;
    ch:char;
    s:string;
    tempBlock:^Block;
begin
 readln(BlockCount);
 readln;
 new(firstBlock);
 CurBlock:=firstBlock;
 iBlock:=0;
 while iBlock<BlockCount do
  begin
   readln(s);
   if s='' then
    begin
     inc(iBlock);
     if iBlock<BlockCount then
      begin
       tempBlock:=CurBlock;
       new(CurBlock);
       tempBlock^.next:=CurBlock;
      end;
     continue;
    end;
   j:=pos(' ',s);
   val(copy(s,1,j-1),num,c);
   delete(s,1,j);
   j:=pos(' ',s);
   val(copy(s,1,j-1),zad,c);
   delete(s,1,j);
   j:=pos(' ',s);
   val(copy(s,1,j-1),time,c);
   delete(s,1,j);
   ch:=s[1];
   AddState(num,zad,time,ch);
  end;
end;

procedure outputProc;
var i,j:byte;
begin
 CurBlock:=firstBlock;
 for i:=1 to BlockCount do
  begin
   for j:=1 to CurBlock^.count do
    writeln(CurBlock^.ar[j].Num,'-',CurBlock^.ar[j].ZadCount,'-',CurBlock^.ar[j].Time);
   writeln;
   CurBlock:=CurBlock^.next;
  end;
end;

procedure normalize;
var i,n:byte;
begin
 n:=1;
 i:=1;
 while n<=CurBlock^.count do
  begin
   if CurBlock^.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 ((CurBlock^.ar[i].ZadCount<CurBlock^.ar[i+1].ZadCount) and (SortParam=SortByZad))
         or ((CurBlock^.ar[i].Time>CurBlock^.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:=CurBlock^.ar[1].ZadCount;
 beg:=1;
 b:=false;
 for i:=2 to CurBlock^.count do
  if CurBlock^.ar[i].ZadCount=temp then
   b:=true
  else
   begin
    if b then sortInterval(beg,i-1,SortByTime);
    b:=false;
    beg:=i;
    temp:=CurBlock^.ar[i].ZadCount;
   end;
 if b then sortInterval(beg,CurBlock^.count,SortByTime);
end;

procedure sort;
var i:byte;
begin
 CurBlock:=firstBlock;
 for i:=1 to BlockCount do
  begin
   normalize;
   sortInterval(1,CurBlock^.Count,SortByZad);
   podSort;
   CurBlock:=CurBlock^.next;
  end;
end;

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

Спасибо тебе Min, большое-пребольшое, по-больше бы всем таких помощников) Все работает) А это, если тебе интересно: у меня выбивало ошибку на объявлении указателя next:^Block;
и я вместо:
type Block=record
next:^Block;
сделала так:
type
BlockRecord = ^Block;
Block = record
next: BlockRecord;
Вроде как тоже самое, но так ей больше нравиться))
Juliya_U вне форума Ответить с цитированием
Старый 09.04.2009, 14:40   #23
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

))))). не знай) TMT не ругается)))
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 14.04.2009, 00:37   #24
Juliya_U
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 20
По умолчанию

Привет, это снова я и моя задача)) Подскажите мне еще) пожал. что я не правильно делаю, мне надо, чтобы: если участник не решил задачу, но пытался штрафное время обнулялось. Т.е. вместо того как сейчас на ввод:
1 4 7 I
Выводит:
1 0 20
Было так:
1 0 0
Для этого я добавила к условию:
if (ch='I') and (not CurBlock^.ar[num].Zad[zad]) then
inc(CurBlock^.ar[num].Time,20);
Еще:
if (ch='I') and (CurBlock^.ar[num].Zad[zad]) then
CurBlock^.ar[num].Time:=0;
Но так не работает, напишите пожал. как надо))

Последний раз редактировалось Juliya_U; 14.04.2009 в 01:54.
Juliya_U вне форума Ответить с цитированием
Старый 14.04.2009, 07:16   #25
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

не совсем понял, что вы имеете ввиду))))
сейчас за каждую неправильно решённую задачу участнику начисляются штрафные баллы. Если участник за задачу даже не брался, то штрафных баллов не начисляется.
Второй предикат условия "if (ch='I') and (not CurBlock^.ar[num].Zad[zad])" означает, что задача ещё не была решена этим участником. Это на случай, если он по ошибке отправит. Т.е. он задачу уже решил. Отправил правильное решение. А затем при отправлении неправильного решения чтобы у него штраф не начислялся.
Вы ставите "if (ch='I') and (CurBlock^.ar[num].Zad[zad])"
Это приведёт к тому, что когда после верно отправленной задачи участник отправит ту же самую, решённую неверно, - штрафное время сбросится.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 14.04.2009, 07:27   #26
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

дополнительное условие звучит некорректно.
допустим:
1 1 1 С
2 1 1 С
1 2 2 С
2 2 2 С
1 3 3 С
2 3 3 I //тут время сбросится
2 3 4 C

В данном случае очевидно присудить победу первому (он и решил все, и с ошибок не было), но по вашему доп. условию победит второй, т.к. на 6й строке его штрафное время сбросится и получится у первого время=6, а у второго=4. И в данном случае начисление штрафных баллов при неверно решённой задаче бессмысленно.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 14.04.2009, 22:53   #27
Juliya_U
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 20
По умолчанию

Да, то что я условие поставила не правильно, это точно)), просто я неправильно поняла код программы. Но я хотела добиться того, чтобы штрафное время учитывалось за неправильное решение, только тогда, если после этого эта задача решена верно. А если участник так и не смог ее решить, то все это штрафное время обнулялось. Пример:
1 4 16 I
1 4 10 C
3 5 12 I
3 5 10 I

1 1 30
3 0 0
А она выводит:
1 1 30
3 0 20
Вот так) А где поставить обнуление я так и не разобралась.
Juliya_U вне форума Ответить с цитированием
Старый 15.04.2009, 08:27   #28
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

тогда вам нужно в структуру Uch добавить ещё один массив[1..9] куда будет записываться штрафное время по соответствующей задаче.
затем когда задача решена, штрафное время этой задачи добавляется к общему штрафному времени.
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 15.04.2009, 08:39   #29
Min
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 239
По умолчанию

чуток меняем/добавляем тут:
Код:
type Uch=record
     Num:byte;
     ZadTime:array[1..9] of longint;
     Time:longint;
     ZadCount:byte;
     Zad:array[1..9] of boolean;
     enabled:boolean;
end;
и тут:
Код:
procedure AddState(num,zad:integer;time:longint;ch:char);
begin
 if not CurBlock^.ar[num].enabled then
  begin
   inc(CurBlock^.count);
   CurBlock^.ar[num].enabled:=true;
   CurBlock^.ar[num].Num:=num;
  end;
 if (ch='C') and (not CurBlock^.ar[num].Zad[zad]) then
  begin
   CurBlock^.ar[num].Zad[zad]:=true;
   inc(CurBlock^.ar[num].Time,CurBlock^.ar[num].ZadTime[zad]);
   inc(CurBlock^.ar[num].Time,time);
   inc(CurBlock^.ar[num].ZadCount);
  end;
 if (ch='I') and (not CurBlock^.ar[num].Zad[zad]) then
  inc(CurBlock^.ar[num].ZadTime[zad],20);
end;
писал по ходу и не компилил. Могут быть косяки. Если будет выводить какие-то левые значения, то нужно в inputProc перед continue добавить процедуру по сбросу всех ZadTime'ов
Надо бы избавиться от привычки ставить многоточие.....
Min вне форума Ответить с цитированием
Старый 17.04.2009, 19:33   #30
Juliya_U
Пользователь
 
Регистрация: 07.04.2009
Сообщений: 20
По умолчанию

Получилось) Еще раз большое спасибо тебе Min за помощь)
Juliya_U вне форума Ответить с цитированием
Ответ


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



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