题目描述
给出三个整数 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 1≤T≤100
1 ≤ a , b ≤ n ≤ 1 0 9 1 \leq a,\ b \leq n \leq 10^9 1≤a, b≤n≤109
这道签到题使我成了全场唯二最靓的仔(就我和另一个小伙伴的了8分,其余人全100分…)
#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;
}
#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;
}
}
}
}