m0_74217538 2024-04-27 19:18 采纳率: 0%
浏览 6

CSP2019-12-3测试点全过,但是只得了30分

#CSP2019-12-3化学方程式,测试点全过的情况下只有三十分。


#include<bits/stdc++.h>
using namespace std;
struct Ti{//结构体里面包括一个待定字符串和数字。可以对标元素及其数量 
    string s0="";
    int count=0;//这个为多位数字到底是几位,像100,count为3,字母和符号都是0 
    int location=-1; 
    int sum=0;//这个是字母的个数; 
    int flag=0;
    int bracketflag=0;
    int bracketflag1=0; 
};
int getCharacter(struct Ti ti[],int size){//获取等号 
    for(int i=0;i<size;i++){
        if(ti[i].s0[0]=='=') return i;
    }
}
void numchange(struct Ti ti[],int size){//数字转化函数 
    for(int i=0;i<=size;i++){
        int s=0;
        if(ti[i].count>0){
        for (int j = 0; j < ti[i].count; j++) {
        int s01=ti[i].s0[j];
        s01-='0';
        s+=s01*pow(10,ti[i].count-j-1);   
        }
     ti[i].count = s; 
    }    
}
}
void getFirst(struct Ti ti[],int size,int flag0){//系数处理函数 
    int t=0; int p=0;
    for(int i=0;i<=size;i++){
        if(ti[0].count>0){
//            cout<<ti[i].flag<<endl;
            if(ti[i].flag==1) t=1;
            if(t==0){
                if(ti[i].sum==1) {
                ti[i].sum*=ti[0].count;
                }    
            }
        }
        else if(ti[i].flag==1){
//            cout<<ti[i].flag<<endl;
            t=1;
        }
//        cout<<t<<endl; 
//        if(t>0) cout<<" 执行0"<<endl;
        if(t>0&&t<=flag0&&ti[i].flag==t){
//            cout<<t<<endl;
            p=i+1;t++;
        }
        if(ti[p].count>0){
            if(ti[i].sum==1){
                ti[i].sum*=ti[p].count;    
            }
        }
    }
}
void getbehind(struct Ti ti[],int size){//处理单一元素后面的数字(即该数字只表示一个元素的数值) 
    for(int i=0;i<=size;i++){
        if(ti[i].count>0&&ti[i-1].sum>0){
            ti[i-1].sum*=ti[i].count;
        } 
    }
}
void getbracketbehind(struct Ti ti[],int size,int bracketflag0){ //如  (Au(CN)2)
    int p=1,t=1;
    for(int i=size;i>0;i--){
        if(ti[i].count>0&&ti[i-1].bracketflag1==1){
             t=ti[i].count;p*=t;
        }
        if(p>1&&ti[i].sum>0) ti[i].sum*=p;
        if(ti[i].bracketflag1==-1){
            p/=t;
            for(int j=i;j<size;j++){
                if(ti[j].bracketflag1==1&&ti[j].bracketflag==ti[i].bracketflag+2&&ti[j+1].count>1){
                    t=ti[j+1].count;break;
                }
            }
        }        
    }
}
bool statistics(struct Ti ti[],int size){
    int f=0;
    int isolation=getCharacter(ti,size);
//    cout<<isolation<<endl;
    for (int i=0;i<isolation;i++){
         if(ti[i].sum>0){
             for(int j=i+1;j<isolation;j++){
                 if(ti[j].s0[0]==ti[i].s0[0]){
                     if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
//                         cout<<"true"<<" "<<j<<" "<<i<<" "<<ti[j].sum<<" "<<ti[i].sum<<" "<<ti[j].s0[1]<<" "<<ti[i].s0[1]<<endl;
                         ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                     }
                    if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                        ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                    }
                 }
             }
         }
    } 
    for(int i=isolation+1;i<=size;i++){
          if(ti[i].sum>0){
             for(int j=i+1;j<=size;j++){
                 if(ti[j].s0[0]==ti[i].s0[0]){
                     if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
//                         cout<<"true"<<" "<<j<<" "<<i<<" "<<ti[j].sum<<" "<<ti[i].sum<<" "<<ti[j].s0[1]<<" "<<ti[i].s0[1]<<endl;
                         ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                     }
                    if((ti[j].s0[1]<='a'||ti[j].s0[1]>='z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                        ti[i].sum+=ti[j].sum;
                         ti[j].sum=0;
                    }
                 }
             }
         }    
    }
     for(int i=0;i<isolation;i++){
             if(ti[i].sum>0){
                 for(int j=isolation+1;j<=size;j++){
                     if(ti[i].sum>0){
                         if(ti[j].s0[0]==ti[i].s0[0]){
                            if((ti[j].s0[1]>='a'&&ti[j].s0[1]<='z')&&ti[j].s0[1]==ti[i].s0[1]){
                                 if(ti[i].sum!=ti[j].sum) f++;
                                 ti[i].sum=0;ti[j].sum=0;
                           }
                           if((ti[j].s0[1]<'a'||ti[j].s0[1]>'z')&&(ti[i].s0[1]<'a'||ti[i].s0[1]>'z')){
                                if(ti[i].sum!=ti[j].sum) f++;
                                ti[i].sum=0;ti[j].sum=0;
                          }
                     }
                         
                     }
               }
             }
         }    
         for(int i=0;i<=size;i++){
             if(ti[i].sum>0) f++;
         }
         if(f==0) return true;
         else return false;
}
int main(){
    int n;cin>>n;string s;
    for(int i=0;i<n;i++){
        cin>>s;Ti ti[1000];int ti0=0;int flag0=0;int bracketflag0=0;int z=0;
        for(int j=0;j<s.length();j++){ 
        //存储函数,多位数字的location显示的是最右边数字的位置,大小写元素的位置显示的是大写字母位置,也就是前端位置
            if(s[j]=='+'||s[j]=='='||s[j]=='('||s[j]==')'){
                if(s[j-1]>='0'&&s[j-1]<='9') ti0++;
                if(s[j]=='+'||s[j]=='=') {
                    if((s[j]=='+'&&s[j+1]=='+')||(s[j]=='='&&s[j+1]=='=') ) z++;
                    flag0++;ti[ti0].flag=flag0;
                }
                if(s[j]=='('||s[j]==')') {
                    bracketflag0++;ti[ti0].bracketflag=bracketflag0;
                    if(s[j]=='(') ti[ti0].bracketflag1=-1;
                    if(s[j]==')') ti[ti0].bracketflag1=1;
                }
                ti[ti0].s0+=s[j];
                ti[ti0].location=j;
                ti0++;
            }
            if(s[j]>='A'&&s[j]<='Z'){
                if(s[j-1]>='0'&&s[j-1]<='9') ti0++;
                ti[ti0].s0+=s[j];
                if(s[j+1]>='a'&&s[j+1]<='z'){ti[ti0].s0+=s[j+1];}
                ti[ti0].location=j;ti[ti0].sum=1;
                if(j!=s.length()-1) ti0++;
                if((s[j+1]>='a'&&s[j+1]<='z')&&j==s.length()-2)ti0--;
            }
            if(s[j]>='0'&&s[j]<='9'){
                ti[ti0].s0+=s[j];    
                ti[ti0].location=j;//这个j应该是右值位置 
                ti[ti0].count++;
            }
        }
        numchange(ti,ti0);
        getFirst(ti,ti0,flag0);
        getbehind(ti,ti0); 
        getbracketbehind(ti,ti0,bracketflag0);
        bool f=statistics(ti,ti0);
//        for(int i0=0;i0<=ti0;i0++){
//                cout<<ti[i0].s0<<" "<<ti[i0].count<<" "<<"  "<<ti[i0].sum<<" "<<ti[i0].flag<<" "<<ti[i0].bracketflag<<" "<<ti[i0].location<<endl;
//            }
        if(z>0) f=false;
        if(f==true) cout<<"Y"<<endl;
        else cout<<"N"<<endl;
    } 
    return 0;
}

  • 写回答

5条回答 默认 最新

  • DTcode7 优质创作者: 前端开发技术领域 2024-05-28 10:11
    关注

    答案引用自chatgpt生成,望对题主有所帮助/启发;若有帮助,还望采纳!

    这个问题的描述有些模糊,没有提供足够的信息来给出一个具体的答案。CSP2019-12-3可能是一个特定的编程竞赛或者测试,但是没有更多的上下文信息,我们无法确定这个测试的具体内容和评分标准。

    如果你在CSP2019-12-3测试中全过,只得了30分,可能有以下几种情况:

    1. 测试的评分标准可能比较严格,即使所有的测试点都通过,也可能因为一些小的错误或者不符合评分标准的代码风格而只得了低分。

    2. 另一种可能是你的解决方案可能不是最优的,即使所有的测试点都通过,也可能因为效率不高或者使用了不推荐的编程技巧而只得了低分。

    3. 还有一种可能是你理解错了题目的要求,虽然所有的测试点都通过,但是因为解决方案不符合题目的要求而只得了低分。

    由于没有更多的信息,我无法给出更具体的建议。建议你查看一下测试的详细规则和评分标准,看看是否有你没有注意到的地方。同时,你也可以尝试和其他参赛者交流,看看他们是如何解决这个问题的。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月27日