ENG  RUSTimus Online Judge
Online Judge
Задачи
Авторы
Соревнования
О системе
Часто задаваемые вопросы
Новости сайта
Форум
Ссылки
Архив задач
Отправить на проверку
Состояние проверки
Руководство
Регистрация
Исправить данные
Рейтинг авторов
Текущее соревнование
Расписание
Прошедшие соревнования
Правила
вернуться в форум

Обсуждение задачи 1154. Сражение магов

What is wrong with my code?
Послано Koala 23 фев 2003 08:57
program p1154;

const
  zero=1e-5;
  allday=24*60*60;
  maxnum=1e+16;

var
  t:array [1..4,1..4] of longint;
  p:array [1..4,1..4] of real;
  g:array [1..2,1..4] of longint;
  now:array [1..4] of real;
  delta:array [1..4,1..3] of real;
  power:array [1..2] of real;
  pp,j,t1,t2,i,time,anstime,h,m,s:longint;
  p1,p2,ans,advantage:real;
  ch:char;

  function change(ch1,ch2:char):longint;
  begin
    change:=(ord(ch1)-ord('0'))*10+(ord(ch2)-ord('0'));
  end;

  procedure readdata(var t:longint; var p:real);
  var
    ch,ch1:char;
    h,m,s:longint;
  begin
    read(ch); while ch=' ' do read(ch); read(ch1);
    h:=change(ch,ch1);
    read(ch); read(ch); read(ch1);
    m:=change(ch,ch1);
    read(ch); read(ch); read(ch1);
    s:=change(ch,ch1);
    t:=h*3600+m*60+s; read(p);
  end;

  procedure print(a:longint);
  begin
    if a<10 then write(0);
    write(a);
  end;

begin
  for pp:=1 to 4 do
  begin
    read(ch);
    j:=0;
    case ch of
      'A': j:=1;
      'E': j:=2;
      'F': j:=3;
      'W': j:=4;
    end;
    readdata(t1,p1); {Power}
    readdata(t2,p2); {Weakness}
    readln;
    if t1<t2
      then begin
        t[j,1]:=t2-allday; p[j,1]:=p2;
        t[j,2]:=t1; p[j,2]:=p1;
        t[j,3]:=t2; p[j,3]:=p2;
        t[j,4]:=t1+allday; p[j,4]:=p1;
      end
      else begin
        t[j,1]:=t1-allday; p[j,1]:=p1;
        t[j,2]:=t2; p[j,2]:=p2;
        t[j,3]:=t1; p[j,3]:=p1;
        t[j,4]:=t2+allday; p[j,4]:=p2;
      end
  end;

  fillchar(g,sizeof(g),0);
  for i:=1 to 2 do
  begin
    while not eoln do
    begin
      read(ch);
      case ch of
        'A': inc(g[i,1]);
        'E': inc(g[i,2]);
        'F': inc(g[i,3]);
        'W': inc(g[i,4]);
      end;
    end;
    readln;
  end;

  for i:=1 to 4 do
    for j:=1 to 3 do
      delta[i,j]:=(p[i,j+1]-p[i,j])/(t[i,j+1]-t[i,j]);

  ans:=-maxnum; anstime:=0;
  for time:=0 to allday-1 do
  begin
    for i:=1 to 4 do
      for j:=1 to 3 do
        if (t[i,j]<time) and (time<=t[i,j+1])
          then now[i]:=p[i,j]+delta[i,j]*(time-t[i,j]);
    for i:=1 to 2 do
    begin
      power[i]:=0;
      for j:=1 to 4 do
        power[i]:=power[i]+g[i,j]*now[j];
    end;
    advantage:=power[1]-power[2];
    if advantage>ans+zero then
    begin
      ans:=advantage;
      anstime:=time;
    end;
  end;

  if ans<0
    then writeln('We can''t win!')
    else begin
      h:=anstime div 3600;
      m:=(anstime div 60) mod 60;
      s:=anstime mod 60;
      print(h); write(':'); print(m); write(':'); print(s); writeln;
      writeln(ans:0:2);
    end;
end.
i don't know what's wrong with you, my program make the same answer of you, need help!
Послано BShell 30 апр 2003 18:14
const ch:array[1..4] of char=('A','E','F','W');
      maxtime=24*60*60;
      e=1e-20;

type elem=array[1..4] of longint;

var a:elem;
    d,f:array[1..4,1..2] of longint;
    l,g:array[1..4] of longint;
    s:string;
    i,j,flag:longint;
    ans,x:extended;

function find(k:char):integer;
var i:integer;
begin
  for i:=1 to 4 do
  if ch[i]=k then exit(i);
end;

function getch:char;
var ch:char;
begin
  read(ch);
  while ch=' ' do read(ch);
  getch:=ch;
end;

function getnext:longint;
var now,i,x:longint;
    ch:char;
begin
  now:=0;
  for i:=1 to 3 do
  begin
    ch:=getch;
    x:=ord(ch)-ord('0');
    ch:=getch;
    x:=x*10+ord(ch)-ord('0');
    now:=now+x;
    now:=now*60;
    if i<3 then ch:=getch;
  end;
  getnext:=now div 60;
end;

procedure readin;
var ch:char;
    t,x,max,min,i:longint;
begin
  read(ch);
  i:=find(ch);
  x:=getnext;
  read(max);
  f[i,1]:=x;
  x:=getnext;
  readln(min);
  f[i,2]:=x;
  if f[i,1]>f[i,2] then
  begin
    t:=f[i,1];
    f[i,1]:=f[i,2];
    f[i,2]:=t;
    d[i,1]:=min;
    d[i,2]:=max;
    g[i]:=(max-min);
    l[i]:=f[i,2]-f[i,1];
  end
  else begin
    g[i]:=min-max;
    l[i]:=f[i,2]-f[i,1];
    d[i,1]:=max;
    d[i,2]:=min;
  end;
end;

procedure print(k:longint);
var x:longint;
begin
  x:=k div 3600;
  if x<10 then write(0);
  write(x,':');
  k:=k mod 3600;
  x:=k div 60;
  if x<10 then write(0);
  write(x,':');
  k:=k mod 60;
  if k<10 then write(0);
  writeln(k);
  writeln(ans:0:2);
end;

function calc(k:longint):extended;
var i,t:longint;
    ans,x:extended;

begin
  ans:=0;
  for i:=1 to 4 do
  if a[i]<>0 then
  begin
    if (f[i,1]<=k) and (k<=f[i,2]) then
      x:=d[i,1]+(k-f[i,1])*g[i]/l[i]
    else begin
      if k>f[i,2] then t:=k-f[i,2]
      else t:=(maxtime-f[i,2])+k;
      x:=d[i,2]-t*g[i]/(maxtime-l[i]);
    end;
    ans:=ans+x*a[i];
  end;
  calc:=ans;
end;

begin
  for i:=1 to 4 do
    readin;
  fillchar(a,sizeof(a),0);
  readln(s);
  for i:=1 to length(s) do
    inc(a[find(s[i])]);
  readln(s);
  for i:=1 to length(s) do
    dec(a[find(s[i])]);
  ans:=-1e20;
  for i:=1 to 4 do
    for j:=1 to 2 do
    begin
      x:=calc(f[i,j]);
      if (x>ans) or (x=ans) and (f[i,j]<flag) then
      begin
        ans:=x;
        flag:=f[i,j];
      end;
    end;
  x:=calc(0);
  if x>ans then
  begin
    ans:=x;
    flag:=0;
  end;
  if ans<=e then writeln('We can''t win!')
  else print(flag);
end.