题意
三头牛放在一条一维坐标轴上,问使得三头牛坐标为连续的三个数字的最大和最小移动牛的次数。(移动的限制:每次只能移动最边上(最左或者最右)的牛,并且移动完该牛后,该牛不能还是最边上的牛了)
解法
因为3头牛数量比较上,情况也比较少,简单枚举一下特殊情况处理掉
①原本三头牛就是连续的,最大最小次数都是0
②两头连续
(1)6 7 9(不连续的那一头与剩下两头最近距离等于2)
只能移动6 到8 的位置上
(2)6 7 10(不连续的那一头与剩下两头最近距离等于2)
把6移到8,把7移到9
③三头都不连续(相邻两头之间距离至少为2)
(1)相邻两头距离都为2,则最大最小次数都为1(7 9 11)
(2)只有两头之间距离为2,剩下两头之间距离大于2,则最小次数为1,最大次数为相邻距离更大的那一个减去一。
(3)距离均大于2,则最小次数为2,最大次数为距离大的那一个的距离减去一。
题面
Description
Input
Output
Sample Input
4 7 9
Sample Output
1
2
Hint
The minimum number of moves is 1 — if Farmer John moves the cow in position 4 to position 8, then the cows are at consecutive locations 7, 8, 9. The maximum number of moves is 2. For example, the cow at position 9 could be moved to position 6, then the cow at position 7 could be moved to position 5.
AC代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,c;
int mi=-1,ma=2;
int d1,d2;
scanf("%d %d %d",&a,&b,&c);
if(a>b)swap(a,b);
if(a>c)swap(a,c);
if(b>c)swap(b,c);
if(c-b==b-a==1)mi=0,ma=0;
d1=b-a;
d2=c-b;
if(d1>d2)swap(d1,d2);
if(d1==d2==1)mi=0;
else if(d1==2&&d2==2)mi=1,ma=1;
else if(d1==1&&d2==2)mi=1,ma=1;
else if(d1==2)mi=1,ma=d2-1;
else mi=2,ma=d2-1;
printf("%d\n%d\n",mi,ma);
return 0;
}
代码写的乱七八糟的,见笑。