牛牛想要成为hacker 题解(斐波那契构造)

题目链接

题目思路

首先要知道斐波那契正是不能组成三角形并且增长速度最慢的数列。

我比赛是直接构造斐波那契前40项然后后面的等差6765

复杂度差不多是\(O(20n^2)\)

.....后面想了一下是个锤子\(O(20n^2)\)

其实是\(O(20C(n,2))=O(10n^2)\)

却还是只能过88%

有一说一感觉真的应该差不多了

但是题目却是更优的构造方法

前面不放1,后面全部放1

这样可以达到差不多\(O(20n^2)\)

自己代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
int n,fac[maxn];
signed main(){
    scanf("%d",&n);
    fac[1]=fac[2]=1;
    for(int i=3;i<=40;i++){
        fac[i]=fac[i-1]+fac[i-2];
    }
    for(int i=41;i<=n;i++){
        fac[i]=fac[i-1]+6765;
    }
    for(int i=1;i<=n;i++){
        printf("%d ",fac[i]);
    }
    return 0;
}

正确代码

#include<bits/stdc++.h>
#define fi first
#define se second
#define debug cout<<"I AM HERE"<<endl;
using namespace std;
typedef long long ll;
const int maxn=1e5+5,inf=0x3f3f3f3f,mod=1e9+7;
const int eps=1e-6;
int n,fac[maxn];
signed main(){
    scanf("%d",&n);
    fac[0]=1; fac[1]=2;
    for(int i=2;i<=40;i++){
        fac[i]=fac[i-1]+fac[i-2];
    }
    for(int i=41;i<=n;i++){
        fac[i]=1;
    }
    for(int i=1;i<=n;i++){
        printf("%d ",fac[i]);
    }
    return 0;
}

不摆烂了,写题
原文地址:https://www.cnblogs.com/hunxuewangzi/p/14370397.html