USACO08 OPEN Roads Around the Farm S (递归)
(我太垃了,得写点题解提升一下)
P2907 [USACO08OPEN] Roads Around The Farm S
题目描述
Farmer John 的奶牛对探索农场周围的领地产生了兴趣。最初,所有 \(N\) 头奶牛(\(1 \leq N \leq 10^9\))以一个大群体的形式开始沿着一条道路旅行。当遇到岔路时,群体有时会选择分成两个较小的(非空)群体,每个群体沿着一条道路继续前进。当其中一个群体到达另一个岔路时,它可能会再次分裂,依此类推。
奶牛们设计了一种特殊的分裂方式:如果它们可以分裂成两个群体,使得群体的大小正好相差 \(K\)(\(1 \leq K \leq 1000\)),那么它们就会以这种方式分裂;否则,它们就停止探索,开始安静地吃草。
假设总是会有新的岔路,计算最终安静吃草的奶牛群的数量。
输入格式
两个空格分隔的整数,\(N\) 和 \(K\)。
输出格式
一个整数,表示安静吃草的奶牛群的数量。
输入输出样例 #1
输入 #1
6 2
输出 #1
3
说明/提示
有 \(6\) 头奶牛,群体大小的差异是 \(2\)。
最终有 \(3\) 个群体(分别有 \(2\)、\(1\) 和 \(3\) 头奶牛)。
6
/ \
2 4
/ \
1 3
(由 ChatGPT 4o 翻译)
就是一个比较简单的递归吧。。。
首先牛群的数量就是分成不同群体的次数再+1,就直接定义ans=1了
假设分出来的两个牛群中,数量较多的是x,数量较少的y
那么x=(n+k)/2, y=(n-k)/2
则 x-y=k,x+y=n
得到2x=n+k;
所以递归的终止条件就是n+k不是偶数了。不是偶数怎么分成两群牛呢???
还有,当x<=0或x>=n的时候递归也终止,怎么可能牛的数量小于0或一群牛的数量大于所有牛的数量呢?
对于y,这也是成立的,所以y<=0或y>=n也是终止条件
否则,ans++, 继续调用x和y
代码如下↓
`#include
using namespace std;
int n,k;
int ans=1;
void f(int n){
int x=(n+k)/2;
int y=n-x;
if((n+k)%2!=0) return ;
else{
if(x<=0||x>=n) return;
if(y<=0||y>=n) return ;
++ans;
f(x);
f(y);
}
}
int main(){
cin>>n>>k;
f(n);
cout<<ans<<endl;
return 0;
}`
就这样了。。。也就嘛嘛。。。
(最近在打音游,求键盘推荐。我用的迈从Ace60 蓝冰磁轴手感真的不戳儿~就是有点吵 啊喂)

浙公网安备 33010602011771号