0
点赞
收藏
分享

微信扫一扫

1683. 困牛放牧(分类讨论)


文章目录

  • ​​Question​​
  • ​​Ideas​​
  • ​​Code​​

Question

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 将位置 4 的奶牛移动到位置 8,那么奶牛们就处在连续的位置 7、8、9。

最大移动次数为 2。例如,位置 9 的奶牛可以被移动到位置 6,然后位置 7 的奶牛可以被移动到位置 5。

Ideas

Ideas is located in Code in following.

Code

# 看了大佬的题解 分类讨论 这个题能想出来是分类讨论 但想不出来怎么讨论
lis = list(map(int,input().strip().split()))
lis.sort()

# 输出最小值
'''
情况1: 3头牛已经连续, 即----abc-----, 直接输出0

情况2: a, b两头牛间隔1, 即---a-b----c-----, 此时只要把c移动到a、b中间即可,输出1

情况3: b, c两头牛间隔1, 即---a-----b-c-----, 此时只要把a移动到b、c中间即可,输出1

情况4: a,b,c 任意两头牛间隔都不为1,即---a------b----c---,

(1)此时只要把c移动到b前面2位,得到---a-----c-b-----,

(2)然后再把a移到c,b中间,得到--------cab-----
一共两次操作,输出2
'''
if lis[2]-lis[0] == 2: # 情况1
print(0)
else:
if lis[0]+2==lis[1] or lis[1]+2 == lis[2]: # 情况2和情况3
print(1)
else: # 情况4
print(2)

# 输出最大值
'''
举例,对于---a------b----c---这种情况,
我们可以贪心地把c移到b前面,再把b移到c前面,接着把c移到b前面,这样往复操作
老规矩,上步骤

1.---a-----cb--------
2.---a----bc---------
3.---a---cb----------
4.---a--bc-----------
5.---a-cb------------
6.---abc-------------
所以我们只需找出b-a和c-b的两个间隔谁更大再减1即可
'''

print(max(lis[1]-lis[0]-1,lis[2]-lis[1]-1))


举报

相关推荐

0 条评论