zoukankan      html  css  js  c++  java
  • Codeforces 633D

    题意:

    给定n,和一个长度为n的序列。

    让你在这n个数中找长度尽可能长的fib数列。

    思路:

    这题的数字是在1e9范围内的,所以最长的可能存在的fib数列官方的解释是90左右。有一种情况除外,就是0的个数比较多的情况下。

    而决定fib数列的是开头的两个数字,以及顺序,介于n是1000的范围我们就可以暴力开头的两个数字啦。这题要注意0的情况,如果整个序列都是0的话,那么复杂度就是1e9了,所以本人先unique了一下,然后每次从unique完的数组里边取材,这样就避免了0的问题同时也某些程度上减少了复杂度。需要注意的是unique完了之后有可能本身和本身作为fib数列的前两个,因为原始序列中可能存在相同的。

    坑点:

    这题我一开始的思路是记忆话搜索,但是...不能保证记录的那个序列和原来的序列没有在数组中重复取材。记住fib的特性啊啊啊啊

    编号和题目中的序列搞混了,WA了两发。

    #include<bits/stdc++.h>
    using namespace std;
    int jilu[1050],aft[1050];
    bool vis[1050];
    int n;
    int ans=2;
    void dfs(int bf,int sum,int step){
        int id=lower_bound(jilu,jilu+n,sum)-jilu;
        if(id>=n||(id==0&&jilu[0]!=sum)){
            if(ans<step)
                ans=step;
        }
        else if(!vis[id]){
            if(jilu[id]==sum){
                vis[id]=1;
                dfs(sum,bf+sum,step+1);
            }
            else{
                if(ans<step)
                   ans=step;
            }
        }
        else{
            while(id<n&&vis[id]&&jilu[id]==sum){
                id++;
            }
            if(id>=n||vis[id]||jilu[id]!=sum){
                if(ans<step)
                   ans=step;
            }
            else{
                vis[id]=1;
                dfs(sum,sum+bf,step+1);
            }
        }
    }
    int main()
    {
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&jilu[i]);
            aft[i]=jilu[i];
        }
        sort(aft,aft+n);
        sort(jilu,jilu+n);
        int num=unique(aft,aft+n)-aft;
        for(int i=0;i<num;i++){
            for(int j=i;j<num;j++){
                memset(vis,0,sizeof(vis));
                if(i==j){
                    int id=lower_bound(jilu,jilu+n,aft[i])-jilu;
                    if(id+1<n&&jilu[id]==jilu[id+1]){
                        vis[id]=vis[id+1]=1;
                        dfs(jilu[id],jilu[id]+jilu[id],2);
                    }
                }
                else{
                    int id1,id2;
                    id1=lower_bound(jilu,jilu+n,aft[i])-jilu;
                    id2=lower_bound(jilu,jilu+n,aft[j])-jilu;
                    vis[id1]=vis[id2]=1;
                    dfs(jilu[id1],jilu[id2]+jilu[id1],2);
                    memset(vis,0,sizeof(vis));
                    vis[id1]=vis[id2]=1;
                    dfs(jilu[id2],jilu[id2]+jilu[id1],2);
                }
            }
        }
        printf("%d
    ",ans);
    }
  • 相关阅读:
    GateWay的简单使用
    SpringCloud项目注册到Nacos
    Hystrix整合Gateway
    Nginx配置socket.io集群
    windows搭建git服务
    解决gitLab上新建分支,idea中找不到对应分支问题
    mybatis mapper.xml的特殊操作符
    Chrome添加Axure RP插件
    idea Tomcat部署时没有update classes and resources
    缓存穿透,缓存击穿,缓存雪崩解决方案分析【转载】
  • 原文地址:https://www.cnblogs.com/tun117/p/5240809.html
Copyright © 2011-2022 走看看