おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Regular Contest 109 A - Hands

問題

問題文へ

100階建ての建物A,Bがあります。i=1,...,100について、建物Aのi階とBのi階は廊下で繋がれています。また、i=1,...,90について、建物Aのi+1階とBのi階は廊下で繋がれています。どの廊下も双方向に通行可能で、移動にはx分かかります。また、A,Bどちらの建物にも階段があり、i=1,...99について、同じ建物のi階とi+1階は階段で繋がれています。どの階段も双方向に通行可能で、移動にはy分かかります。

建物Aのa階から建物Bのb階に移動するのにかかる最短時間を求めてください。

制約

  • {1 \leqq a,b,x,y \leqq 100}
  • 入力はすべて整数

考えたこと

移動時間はAとBをつなぐ廊下と同一建物の階段の2種類と少ないため、思いつく移動パターンをすべて計算して最短距離を求めることを考えました。

コード

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  int a, b, x, y;
  cin >> a >> b >> x >> y;

  int ans = 1000000;
  if (a == b) {
    ans = min(ans, x);
  } else if (a < b) {
    ans = min(ans, (b - a) * y + x);
    ans = min(ans, (b - a + 1 + b - a) * x);
  } else {
    ans = min(ans, x + (a - 1 - b) * y);
    ans = min(ans, (a - b + a - b - 1) * x);
  }

  cout << ans << endl;
  
  return 0;
}

解説を読んで

全然違ってショックです。