JavaScriptのsortは比較方法で実行時間が大きく異なる(ABC153 C - Fennec vs Monster)

結論

数値の配列をソートするときはarr.sort((a,b) => a<b? 1:-1);ではなく、
arr.sort((a,b) => b-a);とするべき。

問題

atcoder.jp

回答

AC(正解)する回答

Submission #9770578 - AtCoder Beginner Contest 153

"use strict"
function Main(input) {
  input = input.split('\n');
  let i1 = input[0].trim().split(' ').map(Number);
  let n = i1[0];
  let k = i1[1];
  let mons = input[1].trim().split(' ').map(Number);
  mons.sort((a,b) => b-a);
  let t = mons.slice(k);
 
  if(t.length === 0) {
    console.log(0)
    return;
  }
 
  let atk = t.reduce((acc, val) => {
    return acc+=val;
  })
 
  console.log(atk)
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));

TLE(実行時間制限超過)する回答

Submission #9746834 - AtCoder Beginner Contest 153

"use strict"
function Main(input) {
  input = input.split('\n');
  let i1 = input[0].trim().split(' ').map(Number);
  let n = i1[0];
  let k = i1[1];
  let mons = input[1].trim().split(' ').map(Number);
  mons.sort((a,b) => a<b? 1:-1);
  let t = mons.slice(k);
 
  if(t.length === 0) {
    console.log(0)
    return;
  }
 
  let atk = t.reduce((acc, val) => {
    return acc+=val;
  })
 
  console.log(atk)
}
Main(require("fs").readFileSync("/dev/stdin", "utf8"));

sortについて

上記の2回答で異なる点は8行目のソート方法です。
ACするコードのソートではmons.sort((a,b) => b-a)で降順ソートを行い、
TLEするコードのソートではmons.sort((a,b) => a<b? 1:-1)で降順ソートを行っています。

ソート後の配列はどちらの方法でも同じになりますが、1つ目の方法ではACとなり、2つ目の方法ではTLEとなります。

原因はよくわかりませんが、ソート時に数値か文字列かが関係してそうです。
とりあえず、数値の配列をソートするときはb-aでするほうがよさそうです。

ちなみに

問題の解答としては、
昇順ソートした配列H0番目からN-K番目まで合算したほうがスマートで良さそうです。

Submission #9770537 - AtCoder Beginner Contest 153