题目相关
题目链接
AtCoder Regular Contest 109 A 题,https://atcoder.jp/contests/arc109/tasks/arc109_a。
Problem Statement
There are two 100-story buildings, called A
and B
. (In this problem, the ground floor is called the first floor.)
For each i=1,…,100 the i-th floor of A
and that of B
are connected by a corridor. Also, for each i=1,…,99, there is a corridor that connects the (i+1)-th floor of A
and the i-th floor of B
. You can traverse each of those corridors in both directions, and it takes you x minutes to get to the other end.
Additionally, both of the buildings have staircases. For each i=1,…,99, a staircase connects the i-th and (i+1)-th floors of a building, and you need yy minutes to get to an adjacent floor by taking the stairs.
Find the minimum time needed to reach the b-th floor of B
from the a-th floor of A
.
Input
Input is given from Standard Input in the following format:
a b x y
Output
Print the minimum time needed to reach the b-th floor of B
from the a-th floor of A
.
Samples1
Sample Input 1
2 1 1 5
Sample Output 1
1
Explaination
There is a corridor that directly connects the 2-nd floor of A
and the 1-st floor of B
, so you can travel between them in 1 minute. This is the fastest way to get there, since taking the stairs just once costs you 5 minutes.
Samples2
Sample Input 2
1 2 100 1
Sample Output 2
101
Explaination
For example, if you take the stairs to get to the 2-nd floor of A
and then use the corridor to reach the 2-nd floor of B
, you can get there in 1+100=101 minutes.
Samples3
Sample Input 3
1 100 1 100
Sample Output 3
199
Explaination
Using just corridors to travel is the fastest way to get there.
Constraints
- 1≤a,b,x,y≤100
- All values in input are integers.
题解报告
题目翻译
有两幢 100 层的大楼 A 和 B,本问题中,底楼称为 1 楼。在 A 和 B 的每一层之间都有通道连接,同时 A 的第 i+1 层和 B 的第 i 层有双向通道连接,需要发费 x 时间。同时大楼内部还有楼梯连接,从第 i+1 楼到第 i 楼需要发费 y 时间。
求从 B 的 b 层到 A 的 a 层需要使用的最少时间。
题目分析
又是一个友善的打卡数学题。
如上图所示,绿色表示大楼 A 和 B 之间的走廊,粉红表示大楼内部的楼梯。本题由于 x 和 y 是固定的,因此不会存在中间更换楼梯和通道的选择。注意通道是 A 的第 i+1 层到 B 的第 i 层这个小细节。我们可以发现两个细节
细节一
我们要从大楼 B 的第 3 层和大楼 B 的第 2 层,我们有两个选择:方案一从大楼 B 第 3 层走走廊到大楼 A 第 2 层,再从走廊走到大楼 B 的第 2 层,这样使用了 2x 时间;方案二从使用楼梯,大楼 B 第 3 层走走廊到大楼 B 第 2 层,这样使用了 y 的时间。因此对我们来说,选择最小的。也就是 min(y, 2x)。如下图所示。
细节二
要从大楼 B 到 大楼 A。至少需要走一次走廊。
AC 参考代码
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int a,b,x,y;
cin >> a >> b >> x >> y;
if(a > b) {
cout << min(y,2*x)*max(0,abs(a-b)-1)+x;
} else {
cout << min(y,2*x)*max(0,abs(a-b))+x;
}
cout<<"\n";
return 0;
}
时间复杂度
O(1)。
空间复杂度
O(1)。