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;
}
谢谢欣赏!

浙公网安备 33010602011771号