策略-广搜问题

题目描述
给出三个整数 a,b,na,b,n 你可以任意地执行以下操作 ::
▶ a = a + b \blacktriangleright a=a+b a=a+b
▶ b = b + a \blacktriangleright b=b+a b=b+a

求使得 n < m a x ( a , b ) n < max(a, b) n<max(a,b) 的最少的操作次数。

输入格式
第一行一个整数 TT,表示数据组数。
接下来 TT 行每行三个整数 a , b , n a,b,n a,b,n,含义如上所述。

输出格式
对于每组数据一行一个数,表示最少操作次数。

输入输出样例
输入

2
1 2 3
5 4 100

输出

2
7

说明/提示
数据范围 ::

1 ≤ T ≤ 100 1 \leq T \leq 100 1T100
1 ≤ a ,   b ≤ n ≤ 1 0 9 1 \leq a,\ b \leq n \leq 10^9 1a, bn109

题解

这道签到题使我成了全场唯二最靓的仔(就我和另一个小伙伴的了8分,其余人全100分…)

  1. 官方做法
#include 

using namespace std;

int main(){
	int t;
	cin>>t;
	long long a,b,n;
	while(t--){
		cin>>a>>b>>n;
		int count =0;
		while(n>=max(a,b)){
			if(a<b) a+=b;
			else b+=a;
			count++;
		}
		cout<<count<<endl;
	} 
}

int max(int a,int b){
	return a>b?a:b;
}
  1. 广搜做法
#include 
using namespace std;

typedef struct node{
	int a;
	int b;
	int s;
}node;

long long int a,b,n;
node q[10001]; 
int head,rear;

int bfs(long long int a,long long int b ,long long int n);

int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>a>>b>>n;
		cout<<bfs(a,b,n)<<endl;
	}
} 

int bfs(long long int a,long long int b ,long long int n){
	
	//队列初始化
	node nd={a,b,0}; 
	q[0]=nd;
	head=0;
	rear=1;
	
	int i;
	while(head!=rear){
		
		//取出队头
		node hd = q[head++];
		int a1=hd.a , b1=hd.b , s1=hd.s ;
		
		if(n<(a1>b1?a1:b1))
			return s1;
			
		//开始尝试两种操作
		for(i=0;i<2;i++){
			if(n < a1+b1 )
				return s1+1;
			if(i==0){
				node td = {a1+b1,b1,s1+1};
				q[rear++]=td;
			}
			if(i==1){
				node td = {a1,b1+a1,s1+1};
				q[rear++]=td;
			}
		} 
		
	}
}

你可能感兴趣的:(#,蓝桥,OJ)