1062 序列中最大的数

1062 序列中最大的数

题目来源: Ural 1079

基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题

收藏

关注

有这样一个序列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
 1 #include <bits/stdc++.h>
 2 #define N 100005
 3 #define ll long long int
 4 using namespace std;
 5 ll k[N],Max[N];
 6 ll List(int x){
 7   if(x==0||x==1)
 8     return x;
 9   else if(x%2==0){
10     return k[x/2];
11   }else{
12     return k[x/2]+k[x/2+1];
13   }
14 }
15 int main(){
16   int n;
17   cin>>n;
18   ll p=0;
19   for(int i=0;i<=N;i++){
20     k[i]=List(i);
21     Max[i]=max(p,k[i]);
22     p=Max[i];
23   }
24   while(n--){
25     int x;
26     cin>>x;
27     cout<<Max[x]<<endl;
28   }
29   return 0;
30 }
 
时间: 2024-10-24 12:02:53

1062 序列中最大的数的相关文章

51nod 1062 序列中最大的数(打表预处理)

1062 序列中最大的数 题目来源: Ural 1079 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 有这样一个序列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] =

51Nod 1062 序列中最大的数

1062 序列中最大的数 题目来源: Ural 1079 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 描述 有这样一个序列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]

51Nod 1062 序列中最大的数 | 简单DP

#include "iostream" #include "cstdio" using namespace std; #define LL long long #define N 100020 int a[N],b[N]; void init() { a[0]=0;a[1]=a[2]=1; b[0]=0;b[1]=b[2]=1; for(int i=3;i<N;i++){ if(i%2) a[i]=a[i/2]+a[i/2+1]; else a[i]=a[i/

训练1:删除序列中相同的数

题目要求: 有16个数{1,2,2,3,4,4,5,6,6,7,8,8,8,9,10,10},已经按由大到小顺序排好,存储在数组a中 试建立一个类ARR,完成删除数组中相同的数,经过删除后,数组中的内容为{1,2,3,4,5,6,7,8,9,10}. #include<iostream> #include<iomanip> using namespace std; class ARR { public: void ARR_delete(); ARR();//构造函数的声明不能用vo

C++程序设计实践指导1.1删除序列中相同的数改写要求实现

改写要求1:改写为以指针为数据结构 #include <iostream> #include <cstdlib> using namespace std; class ARP { int m; int* p; int count[10]; public: ARP(int x[],int size) { m = size; p = new int [m]; for (int i =0;i<m;i++) { p[i]=x[i]; } for (int i =0;i<m;i+

顺序统计:寻找序列中第k小的数

最直观的解法,排序之后取下标为k的值即可. 但是此处采取的方法为类似快速排序分块的方法,利用一个支点将序列分为两个子序列(支点左边的值小于支点的值,支点右边大于等于支点的值). 如果支点下标等于k,则支点就是查找的值,如果支点的下标大于k,则在左子序列里继续寻找,如果支点下标小于k,则继续在支点右子序列里面继续寻找第(k-支点下标)小的值. c#实现算法如下: public class FindSpecialOrderElement<T> where T : IComparable<T&

数组-10. 求整数序列中出现次数最多的数

数组-10. 求整数序列中出现次数最多的数(15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 张彤彧(浙江大学) 本题要求统计一个整型序列中出现次数最多的整数及其出现次数. 输入格式: 输入在一行中给出序列中整数个数N(0<N<=1000),以及N个整数.数字间以空格分隔. 输出格式: 在一行中输出出现次数最多的整数及其出现次数,数字间以空格分隔.题目保证这样的数字是唯一的. 输入样例: 10 3 2 -1 5 3 4 3

输入的数转化为二进制序列,并统计序列中1的个数

★输入的数转化为二进制序列,并统计序列中1的个数 描述:普通的模除取余后数直接除二的办法易于理解,但是对于输入的数只限于正数和零,对于负数则不适应,所以采用与后移位的方法以此来扩大数的输入范围. #include<stdio.h> int main() { int m,b,c,i; int count = 0; char a[32]; printf("请输入一个数:\n"); scanf("%d", &m); for (i = 0; i <

求一个序列中两个只出现一次的数

当然了,O(1)空间复杂度是必须的... 先看一个简单版: 求出一个序列中一个只出现一次的数 COJ 1217 奇数个的那个数 http://122.207.68.93/OnlineJudge/problem.php?id=1217 我们知道任意两个相同的数 异或结果为0  任何数与0异或结果是其本身  异或运算满足交换律 亦即:a^a=0     a^0=a      (a^b)^(a^b)=(a^a)^(b^b)=0^0=0 这样我们就得到了一个用异或运算的解法 1 #include<std