BZOJ 1621 [Usaco2008 Open]Roads Around The Farm分岔路口:分治 递归

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1621

题意:

  约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土地。

  她们将沿着一条路走,一直走到三岔路口(可以认为所有的路口都是这样的)。

  这时候,这一群奶牛可能会分成两群,分别沿着接下来的两条路继续走。

  如果她们再次走到三岔路口,那么仍有可能继续分裂成两群继续走。

  奶牛的分裂方式十分古怪:如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差K(1≤K≤1000),那么在三岔路口牛群就会分裂。否则,牛群不会分裂,她们都将在这里待下去,平静地吃草。

  请计算,最终将会有多少群奶牛在平静地吃草。

 

题解:

  递归分治。

  

  答案为cal(n)。

  对于cal(a),有三种情况:

    (1)a <= k:

      当前牛群不可能再分裂,return 1。

    (2)a和k的奇偶性不同:

      奇数分成两部分,两部分之差一定为奇数。

      偶数分成两部分,两部分之差一定为偶数。

      所以若a和k的奇偶性不同,则不可能再分裂,return 1。

    (3)不属于上两种情况,可以继续分裂,return cal((a-k)/2)+cal((a-k)/2+k)。

 

AC Code:

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 
 5 using namespace std;
 6 
 7 int n,k;
 8 
 9 int cal(int a)
10 {
11     if(a<=k) return 1;
12     if((k&1)!=(a&1)) return 1;
13     return cal((a-k)/2)+cal((a-k)/2+k);
14 }
15 
16 int main()
17 {
18     cin>>n>>k;
19     cout<<cal(n)<<endl;
20 }

 

转载于:https://www.cnblogs.com/Leohh/p/7612761.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值