program ar_daug_kalbate_telefonu;
{ 156 u‘davinys }
{ Sprendimas parengtas pagal olimpiados dalyvio Marijampolie‡io }
{ Vidmanto Maskoli–no darb… }

  const PRAD = 'TELE.DAT';
        MAX_N = 100; { maksimalus pokalbi— skai‡ius }
        NUM = 5; { reikia rasti penkis numerius }
        PAROS = 3; { reikia rasti tris paras }
  type skambutis = record
                     num: string [15];  { numeris }
                     dien,              { diena }
                     pr,                { pradŘia nurodoma minutÓmis}
                     trukme: integer;   { pokalbio trukm‚ minut‚mis }
                     kaina: longint     { kaina nurodoma centais}
                   end;
       pokalbiai = array [1..MAX_N] of skambutis;
       numeriai = array [1..MAX_N] of record
                                        num: string[15];
                                        kaina: longint
                                      end;

procedure skaityti (var n: integer; var sk: pokalbiai);
{ perskaito pradinius duomenis }
  var f: text;
      i, valan, min, klaida: integer;
      litai, centai: longint;
      st1: string[1];
      st2: string [2];
      st3: string [3];
begin
  { perskaitome pradinius duomenis }
  assign (f, PRAD);
  reset (f);
  readln (f, n);
  for i := 1 to n do
    begin
      read (f, sk[i].dien);
      read (f, st3); { _:_ }
      read (f, st2); { pokalbio prad‘ios valanda }
      val (st2, valan, klaida);
      read (f, st1); { tažkas, skiriantis, valandas ir minutes }
      read (f, min);
      sk[i].pr := valan * 60 + min; { radome pokalbio prad‘ios laik… }
      read (f, st3); { _:_ }
      read (f, sk[i].num);  { perskaitomas numeris }
      while sk [i].num [1] = '*' do
        delete(sk[i].num, 1, 1);
      read (f, st3); { _:_ }
      read (f, sk [i].trukme);
      read (f, st3); { _:_ }
      read (f, st3); { sumok‚ti litai }
      val(st3, litai, klaida);
      read (f, st1); { tažkas, skiriantis litus ir centus }
      read (f, centai);
      sk[i].kaina := litai * 100 + centai;
    end;
  close (f);
end; { skaityti }

procedure rasti_num (n: integer; sk: pokalbiai);
{ suranda penkis numerius, kuriais prakalb‚ta daugiausiai }
{ ir juos ižspausdina }
  var kiek, max_sk, nr, i, ii, iii: integer;
      buvo: boolean;
      nums: numeriai; { duomenys apie pinigus, prakalb‚tus kiekvienu }
                      { numeriu }
begin
  { apskaiŃiuojame kiek pinig— prakalbÓta kiekvienu numeriu }
  max_sk := 0; { maksimalus numeri— skai‡ius }
  for i := 1 to n do
    begin
      buvo := false; { ar buvo toks numeris }
      for ii := 1 to max_sk do
        if nums[ii].num = sk[i].num
           then begin
                  buvo := true;
                  nr := ii
                end;
      if buvo { jei toks numeris jau buvo }
        then nums[nr].kaina := nums[nr].kaina + sk[i].kaina
        else begin { Ťtraukiame numerŤ Ť s…raž… }
               max_sk := max_sk + 1;
               nums[max_sk].num := sk[i].num;
               nums[max_sk].kaina := sk[i].kaina
             end;
    end;
  { randame penkis numerius, kuriais prakalbÓta daugiausia }
  kiek := NUM; { tiek numeri— reikia rasti }
  if kiek > max_sk { jei nesusidaro tiek numeri— }
     then kiek := max_sk;
  for i := 1 to kiek do
    begin
      ii := 1;
      for iii := 2 to max_sk do
        if nums[iii].kaina > nums [ii].kaina
           then ii := iii;
      if nums[ii].kaina <> 0
         then write(nums[ii].num, ' ');
      nums [ii].kaina := 0;
    end;
  writeln;
end; { rasti_num }

procedure rasti_paras (n: integer; sk: pokalbiai);
{ randa ir ižspausdina tris paras, kada kalb‚ta daugiausia }
  var dp: array [1..31] of integer;
      { kiek kalb‚ta kiekvien… dien… }
      i, ii, iii: integer;
begin
  { randame kiek kalb‚ta kiekvien… par… }
  for i := 1 to 31 do
    dp[i] := 0;
  for i := 1 to n do
    begin
      if (sk[i].pr + sk[i].trukme-1) < 24*60
         { jei pokalbis prasid‚jo ir baig‚si t… pa‡i… par… }
         then dp[sk[i].dien] := dp[sk[i].dien] + sk[i].trukme
         else begin { jei pokalbis baig‚si kit… par… }
                dp[sk[i].dien] := 24*60 - sk[i].pr;
                dp[sk[i].dien+1] := sk[i].pr + sk[i].trukme - 24*60
              end;
    end;
  { randame tris ar maŘiau paras, kuriomis kalbÓta daugiausiai }
  for i := 1 to PAROS do
    begin
      ii := 1;
      for iii := 1 to 31 do
        if dp[iii] > dp[ii]
           then ii := iii;
      if dp[ii] > 0
         then write (ii, ' ');
      dp[ii] := 0
    end;
  writeln;
end; { rasti_paras }

procedure viet_min (n: integer; sk: pokalbiai);
{ randa ižlaid— dalŤ, kuri… sudaro vietini— ir minut‚s }
{ trukm‚s pokalbiai }
  var i, viet, min, viso: longint;
begin
  { randama iŐlaid— dalis, kuri… sudaro vietiniai pokalbiai }
  viet := 0; viso := 0;
  for i := 1 to n do
    begin
      if sk[i].num [1] <> '8'
         then viet := viet + sk[i].kaina;
      viso := viso + sk[i].kaina;
    end;
  write (viet/viso*100: 4: 2, ' ');
  { randama iŐlaid— dalis, kuri… sudaro pokalbiai po viena minutŠ }
  min := 0;
  for i := 1 to n do
    if sk[i].trukme = 1
       then min := min + sk[i].kaina;
  writeln (min/viso*100: 4: 2);
end; { viet_min }

  var n: integer;
     sk: pokalbiai;
begin { pagrindin‚ programos dalis }
  skaityti (n, sk);
  rasti_num (n, sk);
  rasti_paras (n, sk);
  viet_min (n, sk);
end.