萌新刚学OI,求助高精度。
查看原帖
萌新刚学OI,求助高精度。
491339
Justin999楼主2022/4/20 18:46

萌新刚学OI,不知道为什么只得了40分。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
class LargeInt{
private:
    int len;
    int digit[55];
public:
    void INIT(){
        len=0;
        memset(digit,0,sizeof(digit));
    }
    void get(int x){
        INIT();
        if(x==0){
            len=1;
            return ;
        }
        while(x){
            digit[len++]=x%10;
            x/=10;
        }
    }
    void put(){
        for(register int i=len-1;i>=0;i--){
            printf("%d",digit[i]);
        }
        printf("\n");
    }
    LargeInt operator +(const LargeInt& b){
        LargeInt ret;
        ret.INIT();
        ret.len=max(this->len,b.len);
        for(register int i=0;i<ret.len;i++){
            ret.digit[i]+=this->digit[i]+b.digit[i];
            ret.digit[i+1]+=ret.digit[i]/10;
            ret.digit[i]%=10;
        }
        while(ret.digit[ret.len]){
            ret.len++;
        }
        return ret;
    }
    LargeInt operator *(const LargeInt& b){
        LargeInt ret;
        if((this->len==1&&this->digit[0]==0)||(b.len==1&&b.digit[0]==0)){
            ret.get(0);
            return ret;
        }
        ret.INIT();
        ret.len=this->len+b.len-2;
        for(register int i=0;i<this->len;i++){
            for(register int j=0;j<b.len;j++){
                ret.digit[i+j]+=this->digit[i]*b.digit[j];
                for(register int k=0;k<ret.len;k++){
                    ret.digit[k+1]+=ret.digit[k]/10;
                    ret.digit[k]%=10;
                }
            }
        }
        while(ret.digit[ret.len]){
            ret.len++;
        }
        return ret;
    }
    bool operator <(const LargeInt& b){
        if(this->len<b.len){
            return 1;
        }else if(b.len<this->len){
            return 0;
        }
        for(register int i=this->len-1;i>=0;i--){
            if(this->digit[i]==b.digit[i]){
                continue;
            }else if(this->digit[i]<b.digit[i]){
                return 1;
            }else{
                return 0;
            }
        }
        return 0;
    }
};
int n,m;
LargeInt ans;
LargeInt a[85],dp[85][85];
inline LargeInt max(LargeInt a,LargeInt b){
    if(a<b){
        return b;
    }
    return a;
}
inline LargeInt pow(int p,int q){
    LargeInt ret,Largep;
    Largep.get(p);
    ret.get(1);
    for(register int i=1;i<=q;i++){
        ret=ret*Largep;
    }
    return ret;
}
inline void IN(){
    for(register int i=1;i<=m;i++){
        int x;
        scanf("%d",&x);
        a[i].get(x);
    }
}
inline void DP(){
    for(register int k=2;k<=m;k++){
        for(register int l=1;l+k-1<=m;l++){
            dp[l][k].get(0);
        }
    }
    for(register int l=1;l<=m;l++){
        dp[l][1]=a[l]*pow(2,m);
    }
    for(register int k=2;k<=m;k++){
        const int i=m-k+1;
        for(register int l=1;l+k-1<=m;l++){
            dp[l][k]=max(dp[l][k-1]+a[l+k-1]*pow(2,i),dp[l+1][k-1]+a[l]*pow(2,i));
        }
    }
}
inline void RENEWANS(){
    ans=ans+dp[1][m];
}
int main(){
    ans.INIT();
    scanf("%d %d",&n,&m);
    for(register int i=1;i<=n;i++){
        IN();
        DP();
        RENEWANS();
    }
    ans.put();
    return 0;
}

2022/4/20 18:46
加载中...