csp模测3

2020-07-08  本文已影响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;
}
上一篇下一篇

猜你喜欢

热点阅读