Loading...

luogu P2907 【[USACO08OPEN]农场周围的道路Roads Around The Farm】题解

传送门

来发一篇队列的题解

看了几篇都是用的递归,但是我用的是队列

每次把队头取出,如果符合要求,便分成差为k,和为x的两堆,

可以利用和差问题的方法,即分为(x+k)/2和(x-k)/2。

那什么情况可以不用分呢?

1.x<=k时

2.x不能分为两堆时,即(x+k)不为2的倍数


#include<bits/stdc++.h>
using namespace std;
int ans;
queue<int> q;//定义队列
int main(){
	int n,k;
	cin>>n>>k;q.push(n);//将n入队
	while(!q.empty()){
		int x=q.front();//取出队头
		q.pop();//弹出队头
		if(x>(k+1)&&!((x+k)%2)){//如符合要求
			q.push((x-k)/2);
			q.push((x+k)/2);//分为两堆
		}else{//如不能再分,即牛群停下吃草
			ans++;//累加答案
		}
	}cout<<ans;
	return 0;
}

谢谢欣赏!

posted @ 2020-11-01 00:18  CNF_Acceptance  阅读(130)  评论(0)    收藏  举报