ARC096 C - Half and Half

備忘録

問題

atcoder.jp

回答

"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"));

考え方

私の解答コードはAX枚、BY枚購入した場合と、
ACで揃えたパターン、BCで揃えたパターンをすべて算出し、
最小の値を答えとした。

しかし、他の方の解答を見ていたらもっと良い方法がありました。

Submission #2638727 - AtCoder Regular Contest 096

上記の回答では、

  • AX枚、BY枚購入したパターン
  • AまたはBの最小値からCの購入枚数を決めて、残りのAまたはBを購入するパターン
  • ABをすべてCで作るパターン

の3種類を出して最小値を答えとしていました。
コードとしても、考え方としても、こちらの方の回答のほうが何倍もわかりやすい。。。