【CF633D】Fibonacci-ish

来源:互联网 发布:域名国外申请做跳转 编辑:程序博客网 时间:2024/04/30 13:46

题目描述

  小y最近迷上了fibonacci数列,他定义了一种数列叫类fibonacci数列:

   1.这个数列包含至少2个元素

   2.f0f1是任意选取的

   3.fn+2=fn+1+fn(n0)

  现在,给出一个数列a1an,你可以改变数列元素的顺序,使得a1am满足类fibonacci数列的条件,请求出最大的m

  n1000

题解

  如果有0,就先统计0的个数,然后把这些0删掉。

  首先这个东西的长度是O(log ai)的。

  暴力枚举前两个,查找是否存在第三个。

  可以预处理出来。

  时间复杂度:O(n2logn)

代码

#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<ctime>#include<utility>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> pii;ll a[510];int b[510];int n;int c[510][510];int d1[510];int d2[510];int e[510];int main(){    freopen("a.in","r",stdin);    freopen("a.out","w",stdout);    int i,j,k;    scanf("%d",&n);    if(n==1)    {        printf("%d\n",0);        return 0;    }    for(i=1;i<=n;i++)        scanf("%lld",&a[i]);    sort(a+1,a+n+1);    int m=0;    for(i=1;i<=n;i++)        if(i==1||a[i]!=a[i-1])        {            d1[++m]=a[i];            d2[m]=1;        }        else            d2[m]++;    for(i=1;i<=m;i++)        for(j=1;j<=m;j++)        {            k=lower_bound(d1+1,d1+m+1,d1[i]+d1[j])-d1;            if(k>m||d1[k]!=d1[i]+d1[j])                c[i][j]=0;            else                c[i][j]=k;        }    int ans=0;    for(i=1;i<=n;i++)    {        d2[i]--;        for(j=1;j<=n;j++)            if(d2[j])            {                d2[j]--;                for(k=1;k<=m;k++)                    e[k]=d2[k];                ll s1=i;                ll s2=j;                int num=2;                while(c[s1][s2]&&e[c[s1][s2]])                {                    e[c[s1][s2]]--;                    swap(s1,s2);                    s2=c[s1][s2];                    num++;                }                ans=max(ans,num);                d2[j]++;            }        d2[i]++;    }    printf("%d\n",ans);    return 0;}
原创粉丝点击