刚开始天真的用模拟的从1,1到目标结点,结果当然是暴栈了
然后发现可以从目标结点往1,1走:
1.当前结点a>b说明是父节点的左儿子(fa+fb,fb),就左计数器自增,然后a=a-b;
2.当前结点a<b说明是父节点的右儿子(fa,fa+fb).就右计数器自增,然后b=b-a;
然高高兴兴的提交上去结果TLE了.
主要是因为减速度还是太差应付不了这种情况 目标结点100000000,1
最后发现可以用取模快速的到达转折点来求:
1.当前结点a>b说明是父节点的左儿子(fa+fb,fb),就左计数器+=a/b,然后a=a%b(这里注意b==1的时候结果要减去一个1);
2.当前结点a<b说明是父节点的右儿子(fa,fa+fb).就右计数器+=b/a,然后b=b%a(这里注意a==1的时候结果要减去一个1);
收获挺大#include <iostream>
#include <cstdio>
using namespace std;
int main(){
int t,cas=1;
scanf("%d",&t);
while (t--){
int a,b,ansl=0,ansr=0;
scanf("%d%d",&a,&b);
while (a>1||b>1){
if(a>b){
ansl+=a/b;
a=a%b;
if(b==1)ansl--;
}else{
ansr+=b/a;
b=b%a;
if(a==1)ansr--;
}
}
printf("Scenario #%d:\n%d %d\n\n",cas++,ansl,ansr);
}
return 0;
}