美文网首页
csp模测3

csp模测3

作者: 大家好我是阿凉 | 来源:发表于2020-07-08 20:01 被阅读0次

    A

    image.png

    分析:

    就是签到题orz,遇到和前一个不一样的数,answer就++;

    #include<iostream>
    using namespace std;
    int main()
    {
        int k;cin>>k;
        int c;cin>>c;
        int temp;
        int sum=1;
        for(int i=1;i<k;i++)
        {
            temp=c;
            cin>>c;
            if(c!=temp) sum++;
        }
        cout<<sum<<endl;
        return 0;
     } 
    

    B

    image.png

    思路:

    分开横竖去判断两轮,最后合在一起,其实就是个模拟的过程

    #include<iostream>
    using namespace std;
    int kl[35][35];
    int xiao1[35][35];
    int xiao2[35][35];
    int main()
    {
        int n,m;cin>>n>>m;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>kl[i][j];
                xiao1[i][j]=1;
                xiao2[i][j]=1;
            }   
        }
        int left1;int right1;
        int left2;int right2;
        for(int i=1;i<=n;i++)
        {
            left1=right1=1;
            left2=right2=1;
            for(int j=2;j<=m;j++)
            {
                if(kl[i][j]==kl[i][j-1])
                {
                    right1++;
                }
                if(kl[i][j]!=kl[i][j-1])
                {
                //  cout<<"he"<<endl;
                    if((right1-left1+1)>=3)
                    {
                    //  cout<<i<<"as "<<j<<endl;
                        for(int p=left1;p<=right1;p++) xiao1[i][p]=0;
                    }
                    left1=right1=j;
                }
                if(kl[j][i]==kl[j-1][i])
                {
                    right2++;
                }
                if(kl[j][i]!=kl[j-1][i])
                {
                    if((right2-left2+1)>=3)
                    {
                    //  cout<<i<<" au"<<j<<endl;
                        for(int p=left2;p<=right2;p++) xiao2[p][i]=0;
                    }
                    left2=right2=j;
                }
                if(j==m)
                {
                    if((right2-left2+1)>=3)
                    {
                        //cout<<i<<" au"<<j<<endl;
                        for(int p=left2;p<=right2;p++) xiao2[p][i]=0;
                    }
                    if((right1-left1+1)>=3)
                    {
                    //  cout<<i<<"as "<<j<<endl;
                        for(int p=left1;p<=right1;p++) xiao1[i][p]=0;
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                if(xiao1[i][j]==0||xiao2[i][j]==0) kl[i][j]=0;
                //if(xiao1[i][j]==0) kl[i][j]=-1;
                //if(xiao2[i][j]==0) kl[i][j]=-2;
                cout<<kl[i][j];
                if(j!=m)
                {
                    cout<<" ";
                }
            }
            cout<<endl; 
        }
        return 0;
    }
    
    image.png
    image.png

    这个题就比较麻烦了。开始写的模拟居然爆0 QAQ。
    其实考虑一下,不满足条件的字段就是AB ABBBB。。。 BA BAAAA。。然后全部的子串数量是有公式算出来
    然后为了减少时间复杂度。需要在代码种一次循环找到所有的这些子串数量。
    代码如下

    #include<iostream>
    #include<string>
    #include<string.h>
    #include<cstring>
    using namespace std;
    int c[2000000][2];
    string x;
    int w=0;
    bool panduan(int x1,int y1)
    {
        bool ok=1;
        int middle=(x1+y1)/2;
        int cs=0;
        for(int i=x1;i<=middle;i++)
        {
            if(x[x1]!=x[y1-cs]) 
            {
                ok=0;break;
            }
        }
        if(ok)
        {
            c[w][0]=x1;c[w][1]=y1;
            w++;
        }
        else return 0;
    }
    int main()
    {
        int n;
        cin>>n; 
        cin>>x;
        int left=0;int right=1;
        while(left<n)
        {
            if(right==left) right++;
            if(panduan(left,right)) 
            {
                left++;right=left+1;
            }
            else
            {
                right++;
            }
            if(right>n-1)
            {
                left++;
                right=left+1;
            }
        }
        int sum=0;
        
    
        int lf,rt;
        for(int i=0;i<w;i++)
        {
            sum++;
            lf=c[i][0];rt=c[i][1];
            for(int j=i+1;j<w;j++)
            {
                if(c[j][0]<=rt+1&&c[j][1]>rt) 
                {
                    sum++;
                    rt=c[j][1];
                }
                else break;
            }
        }
        cout<<sum<<endl;
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:csp模测3

          本文链接:https://www.haomeiwen.com/subject/rvogtktx.html