Leaderboard Class
PHP
Hard
7 views
Problem Description
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.
Sample Test Case
Input:
6
ADD Bob 10
ADD Ana 15
ADD Bob 5
TOP 2
ADD Cara 15
TOP 3
Output:
Ana Bob
Ana Cara Bob
Official Solution
<?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);
?>
Solutions (0)
No solutions submitted yet. Be the first!
No comments yet. Start the discussion!