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階に移動するのにかかる最短時間を求めてください。
制約
- 入力はすべて整数
考えたこと
移動時間は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; }
解説を読んで
全然違ってショックです。