函数举例应用+农场周围的道路

农场周围的道路

描述

约翰的N(1≤N≤1,000,000,000)只奶牛要出发去探索牧场四周的土地.她们将沿着一条路走,一直走到三岔路口(可以认为所有的路口都是这样的).这时候,这一群奶牛可能会分成两群,分别沿着接下来的两条路继续走.如果她们再次走到三岔路口,那么仍有可能继续分裂成两群继续走. 奶牛的分裂方式十分古怪:如果这一群奶牛可以精确地分成两部分,这两部分的牛数恰好相差K(1≤K≤1000),那么在三岔路口牛群就会分裂.否则,牛群不会分裂,她们都将在这里待下去,平静地吃草. 请计算,最终将会有多少群奶牛在平静地吃草.-

输入

一行2个用一个空格隔开的整数N和K,1<=N<=10^9。

输出

一行一个整数,表示最后停下来吃草的奶牛的组数。

输入样例 1

6 2

输出样例 1

3

#include<bits/stdc++.h>
using namespace std;
int ans=0;
int cow(int n,int k){
	if(n<=k||(n-k)%2==1){
		++ans;
		return ans;
	}
	cow((n-k)/2,k);
	cow((n+k)/2,k);
}
int main(){
	int n,k;
	scanf("%d%d",&n,&k);
	cout<<cow(n,k);
	return 0;
}

个人理解

本题目主要需要了解分组的规律。
假设有 n 头奶牛,遇到岔路口后分为 x 头和 x+k 头。
则 x+x+k=n 解得 x=(n-k)/2 ,x+k=(n+k)/2;
即每次遇上岔路口就会分成 (n-k)/2 头和 (n+k)/2 头奶牛。
而函数中 if(n<=k||(n-k)%2==1) 是为了避免出现半只牛的情况。奶牛不可能有半只对吧?!!

展开阅读全文

没有更多推荐了,返回首页