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(总结)

谢谢