二叉樹- 數學加速運算
阿新 • • 發佈:2019-02-07
poj1501 Binary Tree
解題思路:
//每一次向左子樹的深入都會改變左值+ 父節點的右值
//每一次沿有字數的深入都會改變右值+ 父節點的左值
//資料量太大,不能考慮從上到下的模擬
//第一個想法:對於每一個節點,執行find_father的操作 執行總共只需要進行log(n)次 但事實上樹高並不是log(n)的而是n的
//把原來的+-查詢變成除法查詢 其實主要是考察數學加速計算 改遞迴為迴圈
程式碼如下:
#include <iostream>
using namespace std;
int T;
int a, b;
int cntl,cntr;
// void find_f(int x, int y)
// {
// if(x == y) return;
// if(x > y)
// {
// cntl++;
// find_f(x - y, y);
// }
// else if(x < y)
// {
// cntr++;
// find_f(x, y - x);
// }
// }
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
scanf("%d",&T);
for(int i = 1; i <= T; i++)
{
cntl = 0; cntr = 0;
printf("Scenario #%d:\n",i);
scanf("%d%d",&a,&b);
while(a != 1 || b != 1)
{
if(a > b)
{
int c = a / b;
a %= b;//只有當b == 1時 a為0
if(!a) --c, a= 1;
cntl += c;
}
else
{
int c = b / a;
b %= a;
if(!b) --c, b = 1;
cntr += c;
}
}
printf("%d %d\n",cntl,cntr);
printf("\n");
}
#ifndef ONLINE_JUDGE
fclose(stdin); fclose(stdout);
#endif
return 0;
}