JavaScriptのsortは比較方法で実行時間が大きく異なる(ABC153 C - Fennec vs Monster)
結論
数値の配列をソートするときはarr.sort((a,b) => a<b? 1:-1);
ではなく、
arr.sort((a,b) => b-a);
とするべき。
問題
回答
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
でするほうがよさそうです。
ちなみに
問題の解答としては、
昇順ソートした配列H
の0
番目からN-K
番目まで合算したほうがスマートで良さそうです。