PTA 二叉树路径
二叉樹的路徑 (25 分)
?二叉樹是一種普通的數據結構。給出一棵無限的二叉樹,節點被標識為一對整數,構造如下:
 ????(1)樹根被標識為整數對(1,1)。
 ????(2)如果一個節點被標識為(a,b),那么其左子樹樹根被標識為(a+b,b),其右子樹樹根被標識為(a,a+b)。
 ????給出上述二叉樹的某個節點標識(a,b),假定從樹根到這一給定的節點是沿著最短的路徑走,你能給出多少次要向左子樹走,多少次要向右子樹走?
輸入格式:
第一行給出測試用例個數。每個測試用例占一行,由兩個整數i和j組成(1<=i, j<=2*109),表示節點的標識(i,j)。假定給出的節點都是有效的節點。
輸出格式:
對每個測試用例,第一行為“Scenario #i:”,其中i是測試用例編號,從1開始編號;然后輸出一行給出兩個整數l和r,中間用1個空格隔開,其中l是從樹根到該節點要向左子樹走的次數,r是從樹根到該節點要向右子樹走的次數。在每個測試用例結束后輸出一個空行。
輸入樣例:
3
53 6
7 8
27 95
輸出樣例:
Scenario #1:
12 1
?
Scenario #2:
6 1
?
Scenario #3:
13 4
?
題意:題目上說了好多,其實就是從(1,1)往下找,找到到(i,j)的最短路徑,輸出要走多少次左子樹,多少次右子樹。
一開始我看到最短路徑,我第一想到的就是bfs去寫,寫完之后交了一發,有一組數據內存超限(我是從(1,1)開始往下找)。然后我就改進了一下算法,用逆向思維,反著搜,就沒有內存超限了,但是時間超限了(哭笑)......之后,我就仔細的想了一想,找了一個規律,原來這是一個思維題,壓根就不是什么搜索題,就是用除法去做,很水...雖然我WA了幾次。
?
#include<iostream> #include<cstdio> #include<queue>using namespace std;int main() {int n,x,y,p=1,l,r;scanf("%d",&n);while(n--){ scanf("%d%d",&x,&y);l=r=0; //l表示要經過左子樹的數量,r表示要經過右子樹的數量while(x!=1||y!=1){if(x>y) {if(y==1)l+=x-1,x=1; //當y為1時,x就只要走x-1步就能變成1了,記住要把x賦為1(跳出的條件所需)elsel+=x/y,x%=y; //當兩個數都不為1時,將其的商加入l中,x的值需要改變成x%y的余數 }else if(x<y){if(x==1)r+=y-1,y=1; //同上elser+=y/x,y%=x; //同上 }}printf("Scenario #%d:\n%d %d\n\n",p++,l,r);} return 0; }?
轉載于:https://www.cnblogs.com/buhuiflydepig/p/10611409.html
總結
                            
                        - 上一篇: 公司人才招聘管理系统
 - 下一篇: Android 开发笔记 一