如何解决"乌托邦树"

时间:2015-08-22 07:18:37

标签: c++

乌托邦树每年经历2个周期的增长。第一个生长周期发生在春季,高度翻倍。第二个生长周期发生在夏季,当它的高度增加1米时。

现在,春天开始种植一棵新的乌托邦树苗。它的高度是1米。在N个生长周期后你能找到树的高度吗?

#include <iostream>
using namespace std;

int height(int n) {
    int h[61],i;
    h[0]=1;

    for(i=1;i<61;i++)
       { if (i%2!=0)               
           h[i]=h[i-1]*2;            
        else h[i]=h[i-1]+1;
}
    cout<<h[n];

    return 0;
}
int main() {
    int T;
    cin >> T;              
    while (T--) {
        int n;
        cin >> n;
        cout << height(n) << endl;
    }
}

5 个答案:

答案 0 :(得分:2)

这是一个避免过多计算的简单解决方案。 请注意以下事项:

n:      Height:     Hint:
0       1           2^0

1       2*1=2       2^1
2       2+1=3       2^2 -1

3       2*3=6       2^3 -2
4       6+1=7       2^3 -1

5       2*7=14      2^4 -2
6       14+1=15     2^4 -1

7       2*15=30     2^5 -2
8       30+1=31     2^5 -1

9       2*31=62     2^6 -2
10      62+1=63     2^6 -1

11      2*63=126    2^7 -2
12      126+1=127   2^7 -1

13      2*127=254   2^8 -2
14      254+1=255   2^8 -1

15      2*255=510   2^9 -2
16      510+1=511   2^9 -1

and so on and so forth...

这意味着我们可以使用位移和避免循环等。这是一个简单的解决方案:

int main(){
    //number of test cases
    int t;
    cin >> t;
    for(int i= 0; i< t; ++i){
        //number of cycles for the tree growth
        int n;
        cin >> n;
        if (n == 0)
            cout << 1 << endl;
        else if (n == 1)
            cout << 2 << endl;
        else if (n > 1){ 
                cout << ((1 << ( (n & 1) ? ((n+1)/2) : (n/2)) + 1) - ((n & 1) ? 2 : 1)) << endl;
        }
    }        
    return 0;
}

关键是要对奇数和偶数的循环次数进行分类并相应地进行处理。

答案 1 :(得分:1)

如果您输入10,代码应根据您的程序生成202 0 1。您可能希望查看输出内容以及从函数返回的内容以及对结果执行的操作。

请注意,总是要检查您的输入是否真正成功,例如使用if (std::cin >> T) { ... }。但是,这不是代码中的问题。

答案 2 :(得分:1)

您应该在此处返回h[n]而不是0

int height(int n) {
    int h[61],i;
    h[0]=1;

    for(i=1;i<61;i++)
       { if (i%2!=0)               
           h[i]=h[i-1]*2;            
        else h[i]=h[i-1]+1;
    }
    //cout<<h[n]<<endl;

    return h[n];
}

另请注意,它正在打印1020,因为h[n]的值实际上是12本身,但函数正在返回{ {1}}本身。

由于声明:

0

打印cout << h[n]; (和1进行下一次调用)然后由于声明:

2

正在打印cout<<height(n); (和0以进行下一次通话)。因此,它为0打印10,然后为height[0]打印20

<强>摘要

  1. 从函数而不是height[0]返回h[n]
  2. 此外,使用带有0的标签或换行符可以最大限度地减少混淆。
  3. 为什么要在coutheight()中打印值。只需在main()
  4. 中进行操作即可

答案 3 :(得分:0)

函数int height(int)应该返回h [n];而不是打印h [n](cout&lt;&lt; h [n];)然后返回0(在你想要的1,2输出旁边加0)。使用您的代码,您应该按如下方式对其进行修改,以使其正常工作:

#include <iostream>
using namespace std;

int height(int n) {
    int h[61],i;
    h[0]=1;

    for(i=1;i<61;i++)
       { if (i%2!=0)               
           h[i]=h[i-1]*2;            
        else h[i]=h[i-1]+1;
}
    //cout<<h[n];

    return h[n];
}
int main() {
    int T;
    cin >> T;              
    while (T--) {
        int n;
        cin >> n;
        cout << height(n) << endl;
    }
}

答案 4 :(得分:0)

函数数组怎么样?

typedef int(*FunctionPrt)(int);

int utopianTree(int n) {
    int initialHeight = 1;

    FunctionPrt functions[] = {
        [](int initialHeight) { return initialHeight * 2; },
        [](int initialHeight) { return initialHeight + 1; }
    };

    for (int cycles = 0, i = 0; cycles < n; i = (i + 1) % 2, ++cycles) {
        initialHeight = functions[i](initialHeight);
    }
    return initialHeight;
}