1. 程式人生 > >二叉樹- 數學加速運算

二叉樹- 數學加速運算

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; }