一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第2天,点击查看活动详情。
题目描述
Farmer John 的三头获奖奶牛 Bessie、Elsie 和 Mildred,总是会迷路走到农场上遥远的地方去!
他需要你帮助将她们一起赶回来。
农场的草地大体是一块狭长的区域——我们可以将其想象成一条数轴,奶牛可以占据数轴上的任意整数位置。
这 3 头奶牛现在正位于不同的整数位置,Farmer John 想要移动她们,使得她们占据三个相邻的位置(例如,位置 6、7、8)。
不幸的是,奶牛们现在很困,Farmer John 要让她们集中精力听从命令移动并不容易。
任意时刻,他只能使得一头处在“端点”(在所有奶牛中位置最小或最大)位置的奶牛移动。
当他移动奶牛时,他可以命令她走到任意一个未被占用的整数位置,只要在新的位置上她不再是一个端点。
可以看到随着时间的推移,这样的移动可以使奶牛们趋向越来越近。
请求出使得奶牛们集中到相邻位置所进行的移动次数的最小和最大可能值。
输入格式
输入包含一行,包括三个空格分隔的整数,为 Bessie、Elsie 和 Mildred 的位置。
输出格式
输出的第一行包含 Farmer John 需要将奶牛们聚集起来所需进行的最小移动次数。
第二行包含他将奶牛聚集起来能够进行的最大移动次数。
数据范围
每个位置均为一个范围 1…109内的整数。
输入样例:
4 7 9
输出样例:
1
2
样例解释
最小移动次数为 1。如果 Farmer John 将位置 44 的奶牛移动到位置 8,那么奶牛们就处在连续的位置 7、8、9。
最大移动次数为 2。例如,位置 9 的奶牛可以被移动到位置 6,然后位置 7 的奶牛可以被移动到位置 5。
思路
如果奶牛之间本来都是相邻的,那么肯定不管最长还是最短都是 0
- 考虑最短的情况: 如果两头牛相差11,显然我们一步就可以插到中间 否则需要两步
- 考虑最长的情况: 显然两头奶牛相邻差的最大值−1就是 (奶牛之间交替的放)
代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 10;
int q[N];
int main()
{
cin >> q[0] >> q[1] >> q[2];
sort(q,q + 1);
int min = 2;
// 求最小值
// 如果两头奶牛之间相差2只需要一步,否则需要两步,相邻需要0步
if(q[0] + 1 == q[1] && q[1] + 1 == q[2]) min = 0;
if(q[2] - q[1] == 2 || q[3] - q[2] == 2) min = 1;
// 求最大值
int max1 = max(q[2] - q[1] - 1,q[1] - q[0] - 1);
cout << min << endl;
cout << max1 << endl;
return 0;
}