#28403: 非遞迴且無迴圈解法


Ist (Ist)

學校 : 不指定學校
編號 : 23295
來源 : [42.77.167.242]
最後登入時間 :
2023-02-18 16:28:05
a042. 平面圓形切割 -- 許介彥 | From: [1.172.213.123] | 發表日期 : 2021-12-08 04:32

解答:2 + input * (input - 1)

 

推想過程:

1個圓可切割成圓內、圓外兩區域

所以f(1) = 2

2個圓除了各自區域外,加上兩圓相接區域以及兩圓以外的區域共4個區域

f(2) = 4

之後最右邊每多一個圓就會將最左邊的圓多切1區域

除了最左邊的圓以外都會多出2區域

所有圓以外的區域則會被多切出1區域

f(n) = f(n - 1) + 1 + (n - 2) * 2 + 1

     = f(n - 1) + (n - 1) * 2

 

接下來以f(5)來推導會看的較清楚

f(5) = f(4) + 4 * 2

     = f(3) + 3 * 2 + 4 * 2

     = f(2) + 2 * 2 + 3 * 2 + 4 * 2

     = f(1) + 1 * 2 + 2 * 2 + 3 * 2 + 4 * 2

     = 2 + (1 + 2 + 3 + 4) * 2

     = 2 + (((1 + 4) * 4) / 2) * 2

     = 2 + (1 + 4) * 4

     = 2 + 5 * (5 - 1)

把f(5)替換回f(n)

就可得知

f(n) = 2 + n * (n - 1)

 

單純分享思考過程喔

 
#30831: Re: 非遞迴且無迴圈解法


lct4246@gmail.com (Ted Lee)

學校 : 不指定學校
編號 : 121097
來源 : [101.10.94.66]
最後登入時間 :
2022-06-15 07:40:24
a042. 平面圓形切割 -- 許介彥 | From: [101.10.94.66] | 發表日期 : 2022-06-15 08:24

解答:2 + input * (input - 1)

 

推想過程:

1個圓可切割成圓內、圓外兩區域

所以f(1) = 2

2個圓除了各自區域外,加上兩圓相接區域以及兩圓以外的區域共4個區域

f(2) = 4

之後最右邊每多一個圓就會將最左邊的圓多切1區域

除了最左邊的圓以外都會多出2區域

所有圓以外的區域則會被多切出1區域

f(n) = f(n - 1) + 1 + (n - 2) * 2 + 1

     = f(n - 1) + (n - 1) * 2

 

接下來以f(5)來推導會看的較清楚

f(5) = f(4) + 4 * 2

     = f(3) + 3 * 2 + 4 * 2

     = f(2) + 2 * 2 + 3 * 2 + 4 * 2

     = f(1) + 1 * 2 + 2 * 2 + 3 * 2 + 4 * 2

     = 2 + (1 + 2 + 3 + 4) * 2

     = 2 + (((1 + 4) * 4) / 2) * 2

     = 2 + (1 + 4) * 4

     = 2 + 5 * (5 - 1)

把f(5)替換回f(n)

就可得知

f(n) = 2 + n * (n - 1)

 

單純分享思考過程喔

這個想法就是遞迴了: 找到遞迴関係式(recurrent relation)
再來就是推導出它解
然而,要用程式求解的話,應該要實現遞迴関係式,而不是去代公式喔~

//題目:https://zerojudge.tw/ShowProblem?problemid=a042
//https://zerojudge.tw/ShowThread?postid=28403&reply=0

#include <iostream>
using namespace std;

int an(int n) {
    if (n == 1)
        return 2;
    else {
        return ((n - 1) * 2 + an(n - 1));        
    }
}

int main(int argc, char** argv) {
    int n = 0;
 
    while ((cin >> n)) { //EOF = ^z = -1    
        cout << an(n) << endl;
    }

    return 0;
}



 
ZeroJudge Forum