探索的奶牛

前言
“前20年我们吃饭,睡觉,玩乐,享受生活;接下来的40年为养家糊口疲于奔命;而最后的10年呢,每天蹲在门口,和过往的行人打着招呼…”欢迎来到嘟嘟课堂。今天,嘟嘟老师讲一道和差问题复杂化再加上递归的题——探索的奶牛。
题目描述
FJ的奶牛喜欢探索农场周围的地形。一开始,所有N(1<=N<=1,000,000,000)只奶牛一起出发,但当碰到路口时,这一群牛可能会分成两部分(不能为空),每一部分都继续前进,当碰到另一个路口时,再分成两部分,如此反复下去。。。
-假设路上到处都是新的岔口,计算最终被分成多少支队伍。
输入
第1行: 两个用空格隔开的整数:N,K
输出
第1行: 输出一个整数表示最终的队伍数。
样例输入
6 2
样例输出
3
样例说明
输入说明:有6只奶牛,分裂时两个小组的人数差为2.
输出说明: 最终有3支队伍分别为(数量分别为2,1,3)
6
/ \
2 4
/ \
1 3
思路
其实这就是一道和差问题。比赛时多加了个这个:

if (k=1) and (n mod 2=0) then
begin
writeln(0);
halt;
end;

就错了。
原因:不过怎样,至少会有一条队伍,就是初始的那条队伍。
我们枚举每个分叉路口的两条队伍,递归大数和小数。
和差问题应该是二年级的奥数内容,要是还没有接触过的,就简单说一下吧:
给出两个数的和与差,求这两个数
附上和差问题的公式:
两个数中较大的数(大数)=(和+差) div 2
两个数中较小的数(小数)=(和-差 ) div 2
详见代码
代码

Download 
var
        n,k,ans:longint;
procedure sb(x:longint);
begin
        if ((x-k) mod 2=0) and ((x-k)>0) then
        begin
                inc(ans);
                sb((x-k) div 2);
                sb((x+k) div 2);
        end;
end;
begin
        ans:=1;
        readln(n,k);
        sb(n);
        writeln(ans);
end.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值