Leaderboard Class

Leaderboard Class

Hard PHP PHP OOP Basics 45 views
Explanation Complexity

Problem Statement

Commands: ADD name score, TOP k. TOP prints top k names by score (desc), tie by name.

Input Format

First line q. Next q lines.

Output Format

Outputs for TOP.

Example

6
ADD Bob 10
ADD Ana 15
ADD Bob 5
TOP 2
ADD Cara 15
TOP 3
Ana Bob
Ana Cara Bob

Constraints

q

Input / Output Format

Input Format
First line q. Next q lines.
Output Format
Outputs for TOP.
Constraints
q

Examples

Input:
6 ADD Bob 10 ADD Ana 15 ADD Bob 5 TOP 2 ADD Cara 15 TOP 3
Output:
Ana Bob Ana Cara Bob

Example Solution (Public)

PHP
<?php
class Leaderboard{
  private $score=[];
  function add($name,$delta){
    if(!isset($this->score[$name])) $this->score[$name]=0;
    $this->score[$name]+=$delta;
  }
  function top($k){
    $arr=[];
    foreach($this->score as $name=>$sc) $arr[] = [$name,$sc];
    usort($arr,function($a,$b){
      if($a[1]===$b[1]) return $a[0] <=> $b[0];
      return $b[1] <=> $a[1];
    });
    $output=[];
    for($i=0;$i<min($k,count($arr));$i++) $output[]=$arr[$i][0];
    return implode(' ',$output);
  }
}
$inputLines=preg_split('/\\R/', rtrim(stream_get_contents(STDIN)));
if(!$inputLines || trim($inputLines[0])==='') exit;
$q=intval($inputLines[0]);
$lb=new Leaderboard(); $output=[];
for($i=1;$i<=$q;$i++){
  $tokens=preg_split('/\\s+/', trim($inputLines[$i] ?? ''));
  $cmd=$tokens[0] ?? '';
  if($cmd==='ADD') $lb->add($tokens[1] ?? '', intval($tokens[2] ?? 0));
  else $output[] = $lb->top(intval($tokens[1] ?? 0));
}
echo implode(PHP_EOL,$output);
?>

Official Solution Code

<?php
class Leaderboard{
  private $score=[];
  function add($name,$delta){
    if(!isset($this->score[$name])) $this->score[$name]=0;
    $this->score[$name]+=$delta;
  }
  function top($k){
    $arr=[];
    foreach($this->score as $name=>$sc) $arr[] = [$name,$sc];
    usort($arr,function($a,$b){
      if($a[1]===$b[1]) return $a[0] <=> $b[0];
      return $b[1] <=> $a[1];
    });
    $output=[];
    for($i=0;$i<min($k,count($arr));$i++) $output[]=$arr[$i][0];
    return implode(' ',$output);
  }
}
$inputLines=preg_split('/\\R/', rtrim(stream_get_contents(STDIN)));
if(!$inputLines || trim($inputLines[0])==='') exit;
$q=intval($inputLines[0]);
$lb=new Leaderboard(); $output=[];
for($i=1;$i<=$q;$i++){
  $tokens=preg_split('/\\s+/', trim($inputLines[$i] ?? ''));
  $cmd=$tokens[0] ?? '';
  if($cmd==='ADD') $lb->add($tokens[1] ?? '', intval($tokens[2] ?? 0));
  else $output[] = $lb->top(intval($tokens[1] ?? 0));
}
echo implode(PHP_EOL,$output);
?>
Please login to submit solutions.
Editor
Output

                                        
Please login to submit solutions.