1. 程式人生 > >51Nod 1062 序列中最大數 打表

51Nod 1062 序列中最大數 打表

有這樣一個序列a:

a[0] = 0

a[1] = 1

a[2i] = a[i]

a[2i+1] = a[i] + a[i+1]

輸入一個數N,求a[0] - a[n]中最大的數。

a[0] = 0, a[1] = 1, a[2] = 1, a[3] = 2, a[4] = 1, a[5] = 3, a[6] = 2, a[7] = 3, a[8] = 1, a[9] = 4, a[10] = 3。

例如:n = 5,最大值是3,n = 10,最大值是4。

收起

輸入

第1行:一個數T,表示後面用作輸入測試的數的數量。(1 <= T <= 10)
第2 - T + 1行:T個數,表示需要計算的n。(1 <= n <= 10^5)

輸出

共T行,每行1個最大值。

輸入樣例

2
5
10

輸出樣例

3
4

 打表。。。

程式碼如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=100005;
int t;
int a[maxn];
int b[maxn];
int n;
void init()
{
    a[0]=0;
    a[1]=1;
    b[0]=0;
    b[1]=1;
    for (int i=2;i<=maxn-5;i++)
    {
        if(i%2==0)
        {
            a[i]=a[i/2];
        }
        else
        {
            a[i]=a[i/2]+a[(i+1)/2];
        }
        if(a[i]>b[i-1])
        {
            b[i]=a[i];
        }
        else
        {
            b[i]=b[i-1];
        }
    }
}
int main()
{
    init();
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&n);
        printf("%d\n",b[n]);
    }
    return 0;
}