这次写题目遇到一个挺有意思的题目

算是初次接触到深度优先搜索,虽然在图的学习中也有学到,但是不够深,而且思维局限在了那几道题目上了。

参考自    这里(戳我!)

这道题的思路是

  假设有n牛,每次相差为k

  那么分完后就变成

  牛多:(n+k)/2

  牛少:(n-k)/2

当然,如果在(n-k)<0的情况下,牛分到头了,以及 (n-k)%2==1 的情况下说明不能再分下去了,他们就不走了

所以只要每次在对,分完的牛继续分,执行递归操作就OK

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll k;
ll dfs(int n)
{
    if(n<=k)return 1;//牛过于少了 
    if((n-k)%2==0)return (dfs((n-k)/2)+dfs((n+k)/2));
    //分的牛堆数等于,分成的两堆之和 
    else return 1;
}
int main()
{
    ll n;
    cin>>n>>k;
    cout<<dfs(n);
    return 0;
} 
View Code

 

posted on 2018-05-24 18:12  阙广壬辰  阅读(245)  评论(0编辑  收藏  举报