请问怎么优化

P1255 数楼梯

tyy_again @ 2024-08-22 18:41:21

#include<bits/stdc++.h>
using namespace std;
long n,cs[6000]={0},js=0,wws=1;
void jw(){
    for(int s=1;s<=wws;s++){
        if(cs[s]/10!=0){
            cs[s]%=10;
            cs[s+1]++;
            if(s==wws)
                wws++;
        }
    }
}
void dg(){
    for(int s=1;s<=2;s++){
        js+=s;
        if(js==n){
            cs[1]++;
            if(cs[1]/10!=0)
                jw();
        }
        else if(js<n)
            dg();
        else if(js>n){
            js-=s;
            break;
        }
        js-=s;
    }
}
int main(){
    cin>>n;
    for(int s=1;s<=2;s++){
        js=0;
        js+=s;
        if(js==n){
            cs[1]++;
            if(cs[1]/10!=0)
                jw();
        }
        else if(js<n)
            dg();
        else if(js>n)
            break;
    }
    for(;wws>0;wws--)
        cout<<cs[wws];
    return 0;
}

请问这题还能怎么优化 5个点超时


by szrgjxms @ 2024-08-22 18:44:00

有没有种可能,这道题是斐波那契数列


by All_Wrong_Answer @ 2024-08-22 18:59:37

@tyy_again

这是高精度+斐波那契数列吧

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <map>
#include <queue>
#include <stack>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
int x[10005];
int y[10005];
int z[10005];
int a;
int f=1;
int main(){
    x[1]=1;
    y[1]=1;
    cin>>a;
    if(a==1){
        cout<<"1";
        return 0;
    }
    for(int i=2;i<=a;i++){
        if(f==1){
            for(int j=1;j<=2000;j++){
                z[j]=(x[j]+y[j]);
            }
            for(int j=1;j<=2000;j++){
                if(z[j]>=10){
                    z[j+1]++;
                    z[j]-=10;
                }
            }

            f=2;
        }
        else if(f==2){
            for(int j=1;j<=2000;j++){
                x[j]=(z[j]+y[j]);
            }
            for(int j=1;j<=2000;j++){
                if(x[j]>=10){
                    x[j+1]++;
                    x[j]-=10;
                }
            }

            f=3;
        }
        else if(f==3){
            for(int j=1;j<=2000;j++){
                y[j]=(z[j]+x[j]);
            }
            for(int j=1;j<=2000;j++){
                if(y[j]>=10){
                    y[j+1]++;
                    y[j]-=10;
                }
            }

            f=1;
        }
    }

    if(f==1){
        int o=0;
        for(int i=2000;i>=1;i--){
            if(o==0&&y[i]!=0) o=1;
            if(o==1) cout<<y[i];
        }
        return 0;
    }
    if(f==2){
        int o=0;
        for(int i=2000;i>=1;i--){
            if(o==0&&z[i]!=0) o=1;
            if(o==1) cout<<z[i];
        }
        return 0;
    }
    if(f==3){
        int o=0;
        for(int i=2000;i>=1;i--){
            if(o==0&&x[i]!=0) o=1;
            if(o==1) cout<<x[i];
        }
        return 0;
    }
    return 0;
}

by tyy_again @ 2024-08-22 19:04:41

thanks


by hhy8399 @ 2024-08-23 23:21:52

@tyy_again 记忆化


|