这次写题目遇到一个挺有意思的题目
算是初次接触到深度优先搜索,虽然在图的学习中也有学到,但是不够深,而且思维局限在了那几道题目上了。
参考自 这里(戳我!)
这道题的思路是
假设有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; }