zju1062 pku1095解題報告

2021-04-12 13:43:30 字數 1496 閱讀 8248

題目分析:

要想構造出一棵編號為n的二*樹,我們只需要知道左子樹的編號和右子樹的編號,就可以進行遞迴構造了。我們目前所能得到的額外的有用資訊,就是具有n個結點的不同形態二*樹的總數目bn = c(2n, n) / (n + 1),但是這個公式的計算較為複雜。我們採用下面的方法來計算:

while(1)//f[t]是結點樹目為 t 時二叉樹的數目 

用遞推的方法來計算,n個結點的二叉樹目=右子樹的個數*左子樹的個樹,程式設計起來較為容易實現。

我們考慮採用逼近的思想。首先,計算出編號為n的二*樹有幾個結點:將n依次減去f[1],f[2],...,f[i],直到不能減為止,即此時n(上面的公式只要對照例圖看就可以得出,不過我還是想了很長的時間(注意是先排右子樹,再排左子樹的))

因此,我們求可得左子樹的編號和右子樹的編號,遞迴求解即可。f[n]可以在程式開始前用遞推的方法高效地預先計算好,以後直接呼叫即可。

這道題用的逼近的思想,是一種非常重要的思想。對於一些全域性統計的問題,如果可以進行區域性統計,則可以利用區域性統計的結果,逐步逼近全域性統計,在逼近的過程中就可以計算出一些中間變數,利用它們便可以解決問題。

例程:#include

#include

using namespace std;

long f[30];

long n;

void init()//遞推計算結點為t時二叉樹的數目 

}void build(int t,long m)

if(t-1-i>0)  //有左子樹   

cout<<"x";

if(i>0)

}      

int main()

build(i,n);

cout《另乙個:

#include

void maketree(int n)

;if(n == 0);

else if(n == 1)

else if(n == 2)

else if(n == 3)

else if(n == 4)

else if(n == 5)

else if(n == 6)

else if(n == 7)

else if(n == 8)

else

if(n <=(2*a[m-1]-a[m-2]))

else if((n>a[m]+a[m-2]-a[m-1]) && n<=a[m])

else

else

break;

}j=1;

while((sum+j*(a[m-i-1]-a[m-i-2]))cout<<'(';

maketree(j+a[i-1]);

cout << ")x(";

maketree(n-sum-(j-1)*(a[m-i-1]-a[m-i-2])+a[m-i-2]);

cout <<")";}}

}int main()

return 0;

}

zju 會員分組

小明是學校電子競技協會的會長,他想過一段時間組織一次協會內部的電子競技比賽。但是為了讓會員們能夠盡量與自己實力相當的人比賽,小明決定將會員們按照當前的會員積分分成若干組,分組的方法如下 對於乙個會員,如果他的積分小於等於10,則分到 1 組 如果積分大於10小於等於100,則分到最近的整十陣列或 1...

zju1041 雷達覆蓋

雷達覆蓋 normal time limit 1000ms memory limit 65536k total submit 75 accepted 35 description 以雷達心為圓心的半圓形雷達覆蓋範圍有多個點 雷達可旋轉,求最多覆蓋數 含在邊界的 分析 先把不能覆蓋的點排除,然後用叉積...

大數乘法 zju 1217

大數乘 time limit 5000ms memory limit 32768k 給定一些大數,請計算其積。輸入資料中含有一些整數對 對數 1000 若某對整數 整數字數 200 的值為0 0,則表示輸入結束。每對整數對應乙個乘法計算結果,輸出該結果,每個結果輸出完後應回車。2 3 12 34 0...