1.探索的奶牛(search)
题目描述
FJ的奶牛喜欢探索农场周围的地形。一开始,所有N(1<=N<=1,000,000,000)只奶牛一起出发,但当碰到路口时,这一群牛可能会分成两部分(不能为空),每一部分都继续前进,当碰到另一个路口时,再分成两部分,如此反复下去。假设路上到处都是新的岔口,计算最终被分成多少支队伍。
输入
第1行: 两个用空格隔开的整数:N,K,其中K表示分裂时两个队伍的奶牛数目差。
输出
1行: 输出一个整数表示最终的队伍数。
样例输入
6 2
样例输出
3
提示
输入说明:有6只奶牛,分裂时两个小组的奶牛差为2.
输出说明:最终有3支队伍分别为
6
/ \
2 4
/ \
1 3
数量分别为2,1,3。
正解
递归一下,注意区分单数和双数就OK了
如果一开始就分不了结果就是1,因为自己也是个数
AC代码
#include<iostream>
#include<cstdio>
using namespace std;
long long n,k,s;
void dg(long long x)
{
long long l,r;
if(x%2==0)//双数时
{
l=x/2-(k+1)/2;
r=x/2+k/2;
}
else //单数时
{
l=(x+1)/2-(k+1)/2;
r=(x+1)/2+k/2;
}
if(l+r==x&&l>=1&&r<=x&&r-l==k)//差别为k,相加为x,未出边界
{
s++;//因为你将一个数拆掉再分两个=s-1+2=s+1
if(l>=k+2)dg(l);//如果还可以分就继续
if(r>=k+2)dg(r);
}
}
int main()
{
freopen("search.in","r",stdin);
freopen("search.out","w",stdout);
cin>>n>>k;
s=1;//自己也是个数
dg(n);//分n
cout<<s;
return 0;
}
下面附本次比赛的其它题目
2020.03.14模拟赛16(第一题)
2020.03.14模拟赛16(第二题)
2020.03.14模拟赛16(第三题)
2020.03.14模拟赛15(第四题)
2020.03.14模拟赛15(总结)