ARC096 C - Half and Half
備忘録
問題
回答
"use strict" function Main(input) { input = input.trim().split(' ').map(Number); let A = input[0]; let B = input[1]; let C = input[2]; let X = input[3]; let Y = input[4]; let ret = A*X + B*Y; if(A + B < 2*C) { console.log(ret); return; } const Xmax = X*2; const Ymax = Y*2; for(let i=1; i<=Xmax; i++){ if(i%2 !== 0) continue; let x = X-i/2 > 0 ? X-i/2 : 0; let y = Y-i/2 > 0 ? Y-i/2 : 0; let m = C*i + x*A + y*B; if(ret > m) ret = m; } for(let i=1; i<=Ymax; i++){ if(i%2 !== 0) continue; let x = X-i/2 > 0 ? X-i/2 : 0; let y = Y-i/2 > 0 ? Y-i/2 : 0; let m = C*i + x*A + y*B; if(ret > m) ret = m; } console.log(ret); } Main(require("fs").readFileSync("/dev/stdin", "utf8"));
考え方
私の解答コードはA
をX
枚、B
をY
枚購入した場合と、
A
をC
で揃えたパターン、B
をC
で揃えたパターンをすべて算出し、
最小の値を答えとした。
しかし、他の方の解答を見ていたらもっと良い方法がありました。
Submission #2638727 - AtCoder Regular Contest 096
上記の回答では、
A
をX
枚、B
をY
枚購入したパターンA
またはB
の最小値からC
の購入枚数を決めて、残りのA
またはB
を購入するパターンA
とB
をすべてC
で作るパターン
の3種類を出して最小値を答えとしていました。
コードとしても、考え方としても、こちらの方の回答のほうが何倍もわかりやすい。。。