LINUX.ORG.RU

История изменений

Исправление firkax, (текущая версия) :

Я понимаю, что ты даже не попробовав решить эту задачу, так лихо размышляешь о том, как это просто сделать. И условие, по твоему мнению, такое понятное и простое. Но это все ровно до того момента, пока ты не докажешь, что можешь за 15 минут решить эту задачу на практике (уже не докажешь).

Попробовал. Ушло не 15 минут, а 22. Писалось в один проход без переделываний и переносов кода. Пришлось уточнить на php.net как работают его функции fgets() и strcmp() (ничего неожиданного там не увидел, но опасался вдруг они работают не так). И исправить два бага - забыл первый аргумент для explode() (пробел) и переставил $bestExp=0 на $bestExp=-1 т.к. с первым некорректно работало.

<?php
  if(!($fp=fopen('php://stdin','r'))) exit;
  $team = array();
  $all = array();
  $curT = 1;
  if(($ln=fgets($fp))===FALSE) { echo "missing N\n"; exit; }
  $N = intval($ln);
  if($N<1 || $N>300000) { echo "wrong N\n"; exit; }
  for($j=1; $j<=$N; $j++) {
    if(($ln=fgets($fp))===FALSE) { echo "missing event $j\n"; exit; }
    list($S, $T) = explode(' ',trim($ln),2);
    if(strlen($S)<1 || strlen($S)>10) { echo "wrong S at event $j\n"; exit; }
    $T = intval($T);
    if($T<1 || $T>1000000000 || $T<$curT) { echo "wrong T at event $j\n"; exit; }
    if($T>$curT) {
      $dt = $T-$curT;
      foreach($team as $name=>$time) $all[$name] += $dt;
      $curT = $T;
    }
    if(isset($team[$S])) unset($team[$S]);
    else { $team[$S] = $T; if(!isset($all[$S])) $all[$S] = 0; }
    $bestName = FALSE; $bestExp = -1; $expSum = 0;
    foreach($team as $name=>$time) {
      $exp = $all[$name];
      $expSum += $exp;
      if($exp>$bestExp || $exp===$bestExp && strcmp($name,$bestName)<0) { $bestName=$name; $bestExp=$exp; }
    }
    if($bestName===FALSE) { echo "bad input at event $j\n"; exit; }
    echo "$bestName ".($expSum-2*$bestExp)."\n";
  }

уже не докажешь

Ну, можешь не верить. Я начал после написания предыдущего коммента а после написания проги ещё 3-4 минуты писал/оформлял этот коммент.

Исправление firkax, :

Я понимаю, что ты даже не попробовав решить эту задачу, так лихо размышляешь о том, как это просто сделать. И условие, по твоему мнению, такое понятное и простое. Но это все ровно до того момента, пока ты не докажешь, что можешь за 15 минут решить эту задачу на практике (уже не докажешь).

Попробовал. Ушло не 15 минут, а 22. Писалось в один проход без переделываний и переносов кода. Пришлось уточнить на php.net как работают его функции fgets() и strcmp(). И исправить два бага - забыл первый аргумент для explode() (пробел) и переставил $bestExp=0 на $bestExp=-1 т.к. с первым некорректно работало.

<?php
  if(!($fp=fopen('php://stdin','r'))) exit;
  $team = array();
  $all = array();
  $curT = 1;
  if(($ln=fgets($fp))===FALSE) { echo "missing N\n"; exit; }
  $N = intval($ln);
  if($N<1 || $N>300000) { echo "wrong N\n"; exit; }
  for($j=1; $j<=$N; $j++) {
    if(($ln=fgets($fp))===FALSE) { echo "missing event $j\n"; exit; }
    list($S, $T) = explode(' ',trim($ln),2);
    if(strlen($S)<1 || strlen($S)>10) { echo "wrong S at event $j\n"; exit; }
    $T = intval($T);
    if($T<1 || $T>1000000000 || $T<$curT) { echo "wrong T at event $j\n"; exit; }
    if($T>$curT) {
      $dt = $T-$curT;
      foreach($team as $name=>$time) $all[$name] += $dt;
      $curT = $T;
    }
    if(isset($team[$S])) unset($team[$S]);
    else { $team[$S] = $T; if(!isset($all[$S])) $all[$S] = 0; }
    $bestName = FALSE; $bestExp = -1; $expSum = 0;
    foreach($team as $name=>$time) {
      $exp = $all[$name];
      $expSum += $exp;
      if($exp>$bestExp || $exp===$bestExp && strcmp($name,$bestName)<0) { $bestName=$name; $bestExp=$exp; }
    }
    if($bestName===FALSE) { echo "bad input at event $j\n"; exit; }
    echo "$bestName ".($expSum-2*$bestExp)."\n";
  }

уже не докажешь

Ну, можешь не верить. Я начал после написания предыдущего коммента а после написания проги ещё 3-4 минуты писал/оформлял этот коммент.

Исходная версия firkax, :

Я понимаю, что ты даже не попробовав решить эту задачу, так лихо размышляешь о том, как это просто сделать. И условие, по твоему мнению, такое понятное и простое. Но это все ровно до того момента, пока ты не докажешь, что можешь за 15 минут решить эту задачу на практике (уже не докажешь).

Попробовал. Ушло не 15 минут, а 22. Писалось в один проход без переделываний и переносов кода. Пришлось уточнить на php.net как работают его функции fgets() и strcmp(). И исправить два бага - забыл первый аргумент для explode() (пробел) и переставил $bestExp=0 на $bestExp=-1 т.к. с первым некорректно работало.

<?php
  if(!($fp=fopen('php://stdin','r'))) exit;
  $team = array();
  $all = array();
  $curT = 1;
  if(($ln=fgets($fp))===FALSE) { echo "missing N\n"; exit; }
  $N = intval($ln);
  if($N<1 || $N>300000) { echo "wrong N\n"; exit; }
  for($j=1; $j<=$N; $j++) {
    if(($ln=fgets($fp))===FALSE) { echo "missing event $j\n"; exit; }
    list($S, $T) = explode(' ',trim($ln),2);
    if(strlen($S)<1 || strlen($S)>10) { echo "wrong S at event $j\n"; exit; }
    $T = intval($T);
    if($T<1 || $T>1000000000 || $T<$curT) { echo "wrong T at event $j\n"; exit; }
    if($T>$curT) {
      $dt = $T-$curT;
      foreach($team as $name=>$time) $all[$name] += $dt;
      $curT = $T;
    }
    if(isset($team[$S])) unset($team[$S]);
    else { $team[$S] = $T; if(!isset($all[$S])) $all[$S] = 0; }
    $bestName = FALSE; $bestExp = -1; $expSum = 0;
    foreach($team as $name=>$time) {
      $exp = $all[$name];
      $expSum += $exp;
      if($exp>$bestExp || $exp===$bestExp && strcmp($name,$bestName)<0) { $bestName=$name; $bestExp=$exp; }
    }
    if($bestName===FALSE) { echo "bad input at event $j\n"; exit; }
    echo "$bestName ".($expSum-2*$bestExp)."\n";
  }

уже не докажешь

Ну, можешь не верить. Я начал после написания предыдущего коммента а после написания проги ещё 4 минуты писал этот коммент.