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。
Input
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 10)
第2 - T + 1行:T个数,表示需要计算的n。(1 <= n <= 10^5)
Output
共T行,每行1个最大值。
Input示例
2
5
10
Output示例
3
4


一般遇到连续区间问题就比较好办,无非两种思路,开个数组维护下前n个系列的和,或者维护最大最小值,比较简单__水题!!!!



#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e5+100;
int a[maxn],b[maxn];
int main()
{
	 ios::sync_with_stdio(false); 
	//freopen("in8.txt","r",stdin);
    //freopen("out.txt","w",stdout);
	int t,i,j,n,maxx;
	a[0]=0;a[1]=1;
	b[0]=0;b[1]=1;
	for(i=2;i<=1e5;i++) {
		if(i%2) a[i]=a[i/2]+a[i/2+1];
		else a[i]=a[i/2];
		b[i]=max(b[i-1],a[i]);
	}
	cin>>t;
	while(t--) {
		cin>>n;
		cout<<b[n]<<endl;
	}
	return 0;
} 




你可能感兴趣的:(51nod 1062 序列中最大的数 (打表,连续区间问题))